SQL 在 table 的所有列中搜索文本值
SQL search all columns of a table for text value
我有一个巨大的 table,其中有很多列,我知道这些列有时会取一些特定的值 'MyValue'。我如何 select 包含 'MyValue' 的特定 table 中的所有行,而不管在哪一列中。
我在这里找到了相关主题:
How do I find a value anywhere in a SQL Server Database?
但我的查询需要一门更小的大炮。我知道 table 这个名字,假设是 'MyTable'。我不需要搜索整个数据库。
您可以通过反转 In
运算符中的值和列来做到这一点。
SELECT *
FROM Mytable
WHERE 'Myvalue' IN ( Col1, Col2, col3,.... )
如果您不想键入列,则将其从 information_schema.column
视图中拉出并创建一个 dynamic query
您可以使用 +
连接所有列,然后执行 LIKE
搜索:
SELECT *
FROM data
WHERE col1 + '#' + col2 + '#' + col3 like '%test%'
在列之间添加分隔符(我使用 #
)可确保您不会从连接中得到误报,例如如果 col2 = 'te' 且 col3 = 'st'
要在简单语句中不使用特殊过程来完成此操作,您可以将每一行转换为 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 条记录 table。但是,如果我分别按每一列进行过滤,它几乎会立即运行。还有一些注意事项:
- None的table列不能有空格等不友好
XML 标签的字符。我无法弄清楚如何使用空格来获取列名。也许有办法。
- 过滤器必须用 XQuery 编写...这不完全一样
SQL。但是你可以使用=、<、>,甚至还有模式匹配。
- 查询函数的参数必须是字符串文字。所以
您不能动态构建字符串。这就是我使用变量作为搜索值的原因,但如果需要,您也可以使用 sql:column("ColName")。
- 如果搜索除字符串以外的其他类型,您使用的搜索字符串必须与字段将转换为 XML 值的内容完全匹配。
我有一个巨大的 table,其中有很多列,我知道这些列有时会取一些特定的值 'MyValue'。我如何 select 包含 'MyValue' 的特定 table 中的所有行,而不管在哪一列中。
我在这里找到了相关主题: How do I find a value anywhere in a SQL Server Database?
但我的查询需要一门更小的大炮。我知道 table 这个名字,假设是 'MyTable'。我不需要搜索整个数据库。
您可以通过反转 In
运算符中的值和列来做到这一点。
SELECT *
FROM Mytable
WHERE 'Myvalue' IN ( Col1, Col2, col3,.... )
如果您不想键入列,则将其从 information_schema.column
视图中拉出并创建一个 dynamic query
您可以使用 +
连接所有列,然后执行 LIKE
搜索:
SELECT *
FROM data
WHERE col1 + '#' + col2 + '#' + col3 like '%test%'
在列之间添加分隔符(我使用 #
)可确保您不会从连接中得到误报,例如如果 col2 = 'te' 且 col3 = 'st'
要在简单语句中不使用特殊过程来完成此操作,您可以将每一行转换为 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 条记录 table。但是,如果我分别按每一列进行过滤,它几乎会立即运行。还有一些注意事项:
- None的table列不能有空格等不友好 XML 标签的字符。我无法弄清楚如何使用空格来获取列名。也许有办法。
- 过滤器必须用 XQuery 编写...这不完全一样 SQL。但是你可以使用=、<、>,甚至还有模式匹配。
- 查询函数的参数必须是字符串文字。所以 您不能动态构建字符串。这就是我使用变量作为搜索值的原因,但如果需要,您也可以使用 sql:column("ColName")。
- 如果搜索除字符串以外的其他类型,您使用的搜索字符串必须与字段将转换为 XML 值的内容完全匹配。