选择包含字符串中子串列表成员的行

时间:2017-11-14 14:27:05

标签: sql-server tsql reportbuilder

在Micrososft SQL Server表中,我有一个带字符串的列。

示例:

'Servernamexyz.server.operationunit.otherstuff.icouldnt.predict.domain.domain2.domain3'

我还有一个动态的子串列表

示例:

('icouldnt', 'stuff', 'banana')

我不关心字符串操作。子串也可以被称为:

('%icouldnt%', '%stuff%', '%banana%')

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

无法解决的问题:

  • WHERE子句中的多个OR语句,列表是动态的
  • 外部代码执行“for each”,它是来自reportbuilder的多值参数,所以这里没什么用处
  • 更改数据库,它是客户正在使用的工具的数据库,我们无法更改它,即使我们想要...这么多

我真的无法相信这样一个简单的问题会变得多么艰难。它需要一个“LIKE IN”命令才能以一种看起来不错的方式进行。现在,除了凌乱的温度表外,我什么都想不到。

1 个答案:

答案 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

输出

enter image description here

编辑 - 使用未知的动态字符串变量 - @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