SQL 服务器:仅当找到子字符串时才显示整列
SQL Server: display whole column only if substring found
正在使用 SQL Sever 2016。我受制于我们无法创建函数或存储过程这一事实。我试图在 table (75) 的许多列中找到 %word%。现在,我有一大堆
and (fieldname1 like %word%
or fieldname2 like %word%
or fieldname3 like %word%) etc.
虽然很麻烦,但这确实为我提供了正确的结果。然而:
- 我想简化这个
- 在
select
中,当且仅当它找到 %word%
时我想显示整个列(或者甚至只显示列名也行)
提前感谢您的任何想法。
一个选项使用 cross apply
反转 table 然后搜索:
select v.*
from mytable t
cross apply (values
('fieldname1', fieldname1),
('fieldname2', fieldname2),
('fieldname3', fieldname3)
) v(fieldname, fieldvalue)
where v.fieldvalue like '%word%'
请注意,如果不止一列包含搜索词,您将在结果集中获得多行。我不确定你想如何处理这个用例(有选项)。
--...slow...
declare @searchfor varchar(100) = '23';
select @searchfor as [thevalue],
thexml.query('for $a in (/*[contains(upper-case(.), upper-case(sql:variable("@searchfor")))])
return concat(local-name($a[1]), ",")').value('.', 'nvarchar(max)') as [appears_in_columns],
*
from
(
select *, (select o.* for xml path(''), type) as thexml
from sys.all_objects as o --table goes here
) as src
where thexml.exist('/*[contains(upper-case(.), upper-case(sql:variable("@searchfor")))]') = 1;
SELECT OBJECT_NAME(id) ObjectName , [Text]
FROM syscomments
WHERE TEXT LIKE '%word%'
正在使用 SQL Sever 2016。我受制于我们无法创建函数或存储过程这一事实。我试图在 table (75) 的许多列中找到 %word%。现在,我有一大堆
and (fieldname1 like %word%
or fieldname2 like %word%
or fieldname3 like %word%) etc.
虽然很麻烦,但这确实为我提供了正确的结果。然而:
- 我想简化这个
- 在
select
中,当且仅当它找到%word%
时我想显示整个列(或者甚至只显示列名也行)
提前感谢您的任何想法。
一个选项使用 cross apply
反转 table 然后搜索:
select v.*
from mytable t
cross apply (values
('fieldname1', fieldname1),
('fieldname2', fieldname2),
('fieldname3', fieldname3)
) v(fieldname, fieldvalue)
where v.fieldvalue like '%word%'
请注意,如果不止一列包含搜索词,您将在结果集中获得多行。我不确定你想如何处理这个用例(有选项)。
--...slow...
declare @searchfor varchar(100) = '23';
select @searchfor as [thevalue],
thexml.query('for $a in (/*[contains(upper-case(.), upper-case(sql:variable("@searchfor")))])
return concat(local-name($a[1]), ",")').value('.', 'nvarchar(max)') as [appears_in_columns],
*
from
(
select *, (select o.* for xml path(''), type) as thexml
from sys.all_objects as o --table goes here
) as src
where thexml.exist('/*[contains(upper-case(.), upper-case(sql:variable("@searchfor")))]') = 1;
SELECT OBJECT_NAME(id) ObjectName , [Text]
FROM syscomments
WHERE TEXT LIKE '%word%'