我知道有几种方法可以找到哪一行的列包含一个字符串,比如使用列名regexp‘’或像‘’这样的列名
虽然目前我需要一些帮助,但我有一个有几个列的表,所有这些都是varchar或text,我不确定哪一列包含特定的字符串。只要说我想从一个表中搜索一个"xxx“,几个不同的列都可以包含这个字符串。有方法可以找到包含这个字符串的哪一列吗?
我有个想法,解决办法可能是
select * from [table name] where [column1] regexp 'xxx' or
[column2] regexp 'xxx' or ...... [column39] regexp 'xxx' or .....
[colum60] regexp 'xxx' or ... or [column 80] regexp 'xxx';我不想要这样的查询。还有其他有效的方法吗?
为了给出一个更好的例子,假设我们正在搜索一个属于博客的表。
我们有标题,网址,内容,关键词,标签,评论等等。现在我们只是说,如果有任何博客文章与“数据库规范化”相关,这个词可能出现在标题、URL或内容或任何地方,我不想一个接一个地写出来
where title regexp 'database-normalization' or content regexp 'database-normalization' or url regexp 'database-normalization'......当有数百列时,我需要写100,或者在这种情况下,是否有一种有效的方法来代替写100或语句?比如使用if-else或集合或其他一些方法来构建查询。
发布于 2018-08-01 05:36:38
如果您预先了解这些列,那么您建议的可能是最有效的方法(如果有点冗长的话)。
否则,您可以从INFORMATION_SCHEMA.COLUMNS获取列名,并在此基础上构造动态SQL。
发布于 2018-08-01 05:57:35
他的问题不是用like子句查询特定列。他一直要求在动态列中应用相同的模式。
示例:包含3列的表-- FirstName、LastName、Address和模式匹配是“以A开头”,然后产生的查询应该是:从客户选择* FirstName,比如'A%‘或LastName像’A%‘,或者地址像’A%‘
如果您想要在业务层构建查询,这可以很容易地通过反射和EF一起完成。
如果您有动机在数据库中执行,那么您可以通过动态构建查询,然后通过sp_executesql执行。
发布于 2018-08-01 10:08:05
尝试以下操作(只需传递表名和要查找的字符串)-:
create proc usp_findString
@tablename varchar(500),
@string varchar(max)
as
Begin
Declare @sql2 varchar(max),@sql nvarchar(max)
SELECT @sql2=
STUFF((SELECT ', case when '+QUOTENAME(NAME)+'='''+@string+''' then 1 else 0 end as '+NAME
FROM (select a.name from sys.columns a join sys.tables b on a.[object_id]=b.[object_id] where b.name=@tablename) T1
--WHERE T1.ID=T2.ID
FOR XML PATH('')),1,1,'')
--print @string
set @sql='select '+@sql2+' from '+@tablename
print @sql
EXEC sp_executesql @sql
EndServer 2014
https://stackoverflow.com/questions/51625784
复制相似问题