SQL搜索表的所有列以获取文本值

时间:2015-01-13 09:30:12

标签: sql sql-server search select text

我有一个包含许多列的大表,我知道这些列有时需要一些特定的值'MyValue'。如何选择包含“MyValue”的特定表中的所有行,而不管哪个列。

我在这里找到相关主题: How do I find a value anywhere in a SQL Server Database?

但我的查询需要更小的大炮。我知道表名,就是说'MyTable'。我不需要搜索整个数据库。

3 个答案:

答案 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'

SQL Fiddle

答案 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记录表上搜索了一下。但是,如果我按每个列单独过滤它几乎立即运行。还有一些警告:

  • 没有表格列不能有空格或其他不友好 XML标记的字符。我无法弄清楚如何使用空格来获取列名。也许有办法。
  • 过滤器必须用XQuery编写......这不完全一样 SQL。但你可以使用=,&lt;,&gt;,甚至还有模式匹配。
  • 查询函数的参数必须是字符串文字。所以 你不能动态地建立一个字符串。这就是我将变量用于搜索值的原因,但如果需要,您也可以使用sql:column(“ColName”)。
  • 如果搜索除字符串之外的其他类型,您使用的搜索字符串必须与字段转换为XML值完全匹配。