【问题标题】:SQL search all columns of a table for text valueSQL 在表的所有列中搜索文本值
【发布时间】:2015-03-11 05:05:24
【问题描述】:

我有一个包含许多列的巨大表,我知道这些列有时会采用一些特定值“MyValue”。无论在哪一列,如何选择包含“MyValue”的特定表中的所有行。

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

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

【问题讨论】:

  • 您的意思是 (1) 表中的所有行,其中至少有一行包含 MyValue,还是 (2) 仅包含 MyValue 的行?
  • @jarlh 我想选择所有包含 'john' 的行,无论 'john' 是在 FirstName 列还是 LastName 列或 WhatEverOther 列。 'john' 必须在至少一列中。
  • 我认为这是糟糕的数据库设计/想法。
  • 您是否也在使用 SQL Server 或其他 DBMS?

标签: sql sql-server search select text


【解决方案1】:

要在简单语句中不使用特殊过程来执行此操作,您可以将每一行转换为 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。但你可以使用 =、,甚至还有模式匹配。
  • 查询函数的参数必须是字符串文字。所以 您不能动态构建字符串。这就是我使用变量作为搜索值的原因,但如果需要,您也可以使用 sql:column("ColName")。
  • 如果搜索字符串以外的其他类型,您使用的搜索字符串必须与字段将转换为 XML 值的内容完全匹配。

【讨论】:

  • 谢谢。将其转换为 XML 很聪明
  • 这是sql server相关查询?
  • 是的,XML 数据类型和方法可以在 SQL Server 2005 及更高版本中使用。
【解决方案2】:

您可以使用+ 连接所有列,然后执行LIKE 搜索:

SELECT *
FROM   data
WHERE  col1 + '#' + col2 + '#' + col3 like '%test%'

在列之间添加分隔符(我使用#)可确保您不会从串联中得到误报,例如如果 col2 = 'te' 和 col3 = 'st'

SQL Fiddle

【讨论】:

    【解决方案3】:

    您可以通过反转 In 运算符中的值和列来做到这一点。

    SELECT *
    FROM   Mytable
    WHERE  'Myvalue' IN ( Col1, Col2, col3,.... ) 
    

    如果您不想键入列,则将其从 information_schema.column 视图中拉出并创建一个 dynamic query

    【讨论】:

    • “包含”,我想需要 LIKE。对于大多数 dbms 来说,这并不是一个理想的解决方案...
    • @jarlh - 我不确定他说containing 是什么意思。但他/她正在Sql Server 中寻找解决方案
    • @Przemyslaw Remin 考虑将此作为公认的答案 - 可能是最干净的方式
    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2017-07-04
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多