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%')

查找字符串包含其中一个子字符串的所有行的最佳方法是什么?

不可能的解决方案:

我真不敢相信这么简单的问题竟然这么难。它需要一个 "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