在Micrososft SQL Server表中,我有一个带字符串的列。
示例:
'Servernamexyz.server.operationunit.otherstuff.icouldnt.predict.domain.domain2.domain3'
我还有一个动态的子串列表
示例:
('icouldnt', 'stuff', 'banana')
我不关心字符串操作。子串也可以被称为:
('%icouldnt%', '%stuff%', '%banana%')
查找字符串包含其中一个子字符串的所有行的最佳方法是什么?
无法解决的问题:
我真的无法相信这样一个简单的问题会变得多么艰难。它需要一个“LIKE IN”命令才能以一种看起来不错的方式进行。现在,除了凌乱的温度表外,我什么都想不到。
答案 0 :(得分:0)
一种选择是使用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