我有一个包含许多列的大表,我知道这些列有时需要一些特定的值'MyValue'。如何选择包含“MyValue”的特定表中的所有行,而不管哪个列。
我在这里找到相关主题: How do I find a value anywhere in a SQL Server Database?
但我的查询需要更小的大炮。我知道表名,就是说'MyTable'。我不需要搜索整个数据库。
答案 0 :(得分:6)
您可以通过撤消In
运算符中的值和列来执行此操作。
SELECT *
FROM Mytable
WHERE 'Myvalue' IN ( Col1, Col2, col3,.... )
如果您不想输入列,请从information_schema.column
视图中提取列并创建dynamic query
答案 1 :(得分:4)
您可以使用+
连接所有列,然后执行LIKE
搜索:
SELECT *
FROM data
WHERE col1 + '#' + col2 + '#' + col3 like '%test%'
在列之间添加分隔符(我使用#
)可确保您不会从串联中获得误报,例如如果col2 =' te'和col3 =' st'
答案 2 :(得分:3)
要在没有特殊过程的情况下在简单语句中执行此操作,您可以将每行转换为XML,然后在XML上使用XQuery来搜索匹配行中的任何值。例如:
declare @SearchValue as varchar(20)
set @SearchValue = 'MyValue'
select *
--,(select MyTable.* for XML PATH (''),TYPE) AllColumns
--,convert(nvarchar(255),(select MyTable.* for XML PATH (''),TYPE).query('for $item in * where $item=sql:variable("@SearchValue") return $item')) FoundColumns
from MyTable
where convert(nvarchar(255),(select MyTable.* for XML PATH (''),TYPE).query('for $item in * where $item=sql:variable("@SearchValue") return $item'))<>''
专门为此任务设计的程序可能可以更有效地执行此操作并可以利用索引......等等。老实说,我不会在没有相当多考虑的情况下将其放入生产数据库解决方案中,而是作为一起抛出搜索工具不错。我在40秒内在700,000记录表上搜索了一下。但是,如果我按每个列单独过滤它几乎立即运行。还有一些警告: