SQL NOT LIKE与动态列表的比较

时间:2019-02-13 19:42:00

标签: tsql stored-procedures

使用新的TSQL存储过程,我想获取所有行,其中特定列中的值不以特定的2个字符子字符串集开头。

总体思路是:

SELECT * FROM table WHERE value NOT LIKE 's1%' AND value NOT LIKE 's2%' AND value NOT LIKE 's3%'

问题在于,我正在尝试使其动态化,以便可以从数据库中的另一个表中提取特定的子字符串,该表中可以添加更多的值。

虽然我以前从未使用过IN运算符,但是我认为这些内容应该可以满足我的需求,但是,我认为无法在IN中使用通配符,因此我可能无法仅比较子字符串。

SELECT * FROM table WHERE value NOT IN (SELECT substrings FROM subTable)

要解决该限制,我正在尝试执行以下操作:

SELECT * FROM table WHERE SUBSTRING(value, 1, 2) NOT IN (SELECT Prefix FROM subTable WHERE Prefix IS NOT NULL)

但是我不确定这是正确的,还是这是最有效的方法。我的偏好是在存储过程中执行此操作,但是如果这样做不可行或无效,我也愿意在C#中动态构建查询。

1 个答案:

答案 0 :(得分:1)

这是一个选项。将要过滤的值加载到表中,左外连接并使用PATINDEX()

DECLARE @FilterValues TABLE
    (
        [FilterValue] NVARCHAR(10)
    );

--Table with values we want filter on.
INSERT INTO @FilterValues (
                              [FilterValue]
                          )
VALUES ( N's1' )
     , ( N's2' )
     , ( N's3' );

DECLARE @TestData TABLE
    (
        [TestValues] NVARCHAR(100)
    );

--Load some test data
INSERT INTO @TestData (
                          [TestValues]
                      )
VALUES ( N's1 Test Data' )
     , ( N's2 Test Data' )
     , ( N's3 Test Data' )
     , ( N'test data not filtered out' )
     , ( N'test data not filtered out 1' );


SELECT          a.*
FROM            @TestData [a]
LEFT OUTER JOIN @FilterValues [b]
    ON PATINDEX([b].[FilterValue] + '%', [a].[TestValues]) > 0
WHERE           [b].[FilterValue] IS NULL;