使用新的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#中动态构建查询。
答案 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;