Select 行包含字符串中子字符串列表的任何成员
Select rows with any member of list of substrings in string
在 Micrososft SQL 服务器中 table 我有一个带有字符串的列。
示例:
'Servernamexyz.server.operationunit.otherstuff.icouldnt.predict.domain.domain2.domain3'
我还有一个子字符串的动态列表
示例:
('icouldnt', 'stuff', 'banana')
我不关心字符串操作。子字符串也可以称为:
('%icouldnt%', '%stuff%', '%banana%')
查找字符串包含其中一个子字符串的所有行的最佳方法是什么?
不可能的解决方案:
- WHERE子句中的多个OR语句,列表是动态的
- 执行 "for each" 的外部代码,它是 reportbuilder 的多值参数,所以这里没有用处
- 更改数据库,它是客户正在使用的工具的数据库,我们无法更改它,即使我们想要...这么多
我真不敢相信这么简单的问题竟然这么难。它需要一个 "LIKE IN" 命令才能以一种看起来不错的方式进行。现在我除了乱七八糟的温度什么都想不起来了 table.
一种选择是使用 CHARINDEX
DECLARE @tab TABLE (Col1 NVARCHAR(200))
INSERT INTO @tab (Col1)
VALUES (N'Servernamexyz.server.operationunit.otherstuff.icouldnt.predict.domain.domain2.domain3' )
;WITH cteX
AS(
SELECT 'icouldnt' Strings
UNION ALL
SELECT 'stuff'
UNION ALL
SELECT 'banana'
)
SELECT
T.*, X.Strings
FROM @tab T
CROSS APPLY (SELECT X.Strings FROM cteX X) X
WHERE CHARINDEX(X.Strings, T.Col1) > 1
输出
编辑 - 使用未知的动态字符串变量 - @substrings
DECLARE @tab TABLE (Col1 NVARCHAR(200))
INSERT INTO @tab (Col1)
VALUES (N'Servernamexyz.server.operationunit.otherstuff.icouldnt.predict.domain.domain2.domain3' )
DECLARE @substrings NVARCHAR(200) = 'icouldnt,stuff,banana'
SELECT
T.*, X.Strings
FROM @tab T
CROSS APPLY
( --dynamically split the string
SELECT Strings = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@substrings, ',', '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
) X
WHERE CHARINDEX(X.Strings, T.Col1) > 1
在 Micrososft SQL 服务器中 table 我有一个带有字符串的列。
示例:
'Servernamexyz.server.operationunit.otherstuff.icouldnt.predict.domain.domain2.domain3'
我还有一个子字符串的动态列表
示例:
('icouldnt', 'stuff', 'banana')
我不关心字符串操作。子字符串也可以称为:
('%icouldnt%', '%stuff%', '%banana%')
查找字符串包含其中一个子字符串的所有行的最佳方法是什么?
不可能的解决方案:
- WHERE子句中的多个OR语句,列表是动态的
- 执行 "for each" 的外部代码,它是 reportbuilder 的多值参数,所以这里没有用处
- 更改数据库,它是客户正在使用的工具的数据库,我们无法更改它,即使我们想要...这么多
我真不敢相信这么简单的问题竟然这么难。它需要一个 "LIKE IN" 命令才能以一种看起来不错的方式进行。现在我除了乱七八糟的温度什么都想不起来了 table.
一种选择是使用 CHARINDEX
DECLARE @tab TABLE (Col1 NVARCHAR(200))
INSERT INTO @tab (Col1)
VALUES (N'Servernamexyz.server.operationunit.otherstuff.icouldnt.predict.domain.domain2.domain3' )
;WITH cteX
AS(
SELECT 'icouldnt' Strings
UNION ALL
SELECT 'stuff'
UNION ALL
SELECT 'banana'
)
SELECT
T.*, X.Strings
FROM @tab T
CROSS APPLY (SELECT X.Strings FROM cteX X) X
WHERE CHARINDEX(X.Strings, T.Col1) > 1
输出
编辑 - 使用未知的动态字符串变量 - @substrings
DECLARE @tab TABLE (Col1 NVARCHAR(200))
INSERT INTO @tab (Col1)
VALUES (N'Servernamexyz.server.operationunit.otherstuff.icouldnt.predict.domain.domain2.domain3' )
DECLARE @substrings NVARCHAR(200) = 'icouldnt,stuff,banana'
SELECT
T.*, X.Strings
FROM @tab T
CROSS APPLY
( --dynamically split the string
SELECT Strings = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@substrings, ',', '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
) X
WHERE CHARINDEX(X.Strings, T.Col1) > 1