Sql server 使用条件运算符返回记录的T-SQL SELECT语句

Sql server 使用条件运算符返回记录的T-SQL SELECT语句,sql-server,tsql,conditional-statements,Sql Server,Tsql,Conditional Statements,我正在使用SSMS 17.9.1-我有一个带有ContractNo和RightCodes列的表。有关示例数据,请参见图像附件: 我需要一个SELECT语句,该语句将返回rights代码为'904'或'908'的行,但不存在其他具有相同ContractNo的行,这些行具有rights代码,如'922'或'923'或'924' 因此,在示例数据中,我希望返回第1行和第8行 可以有x个行具有相同的ContractNo。和RightCodes每个ContractNo 提前非常感谢。制作一些数据(注意存

我正在使用SSMS 17.9.1-我有一个带有
ContractNo
RightCodes
列的表。有关示例数据,请参见图像附件:

我需要一个
SELECT
语句,该语句将返回
rights代码为'904'或'908'的行,但不存在其他具有相同
ContractNo
的行,这些行具有
rights代码,如'922'
或'923'或'924'

因此,在示例数据中,我希望返回第1行和第8行

可以有x个行具有相同的
ContractNo
。和
RightCodes
每个
ContractNo

提前非常感谢。

制作一些数据(注意存储数据的糟糕方式):

根据需要编写查询以提取数据:

SELECT
    *
FROM
    @bad_table b
WHERE
    (b.rightcodes LIKE '%904%' OR b.rightcodes LIKE '%908%')
    AND NOT EXISTS (SELECT * FROM @bad_table xb WHERE xb.contractno = b.contractno AND (xb.rightcodes LIKE '%922%' OR xb.rightcodes LIKE '%923%'));

这将给出您想要的结果,即第1行和第8行。

尽管提供的大量样本数据似乎没有问题,但这种匹配子字符串的方法包含了一个重要问题。如果它用于检查
'23'
,它将在
'23'
'123456'
'12321'
。另一种方法是使用“
”、“+levilistColumn+”、“%”等“%”、“++@TargetValue+”、“%”
”,以确保找到的值由逗号分隔。另一种选择是以基于集合的方式使用和比较分离的值。@HABO-感谢您指出这一点。在本例中,值的范围为904-972,因此我不认为这是一个问题。
SELECT
    *
FROM
    @bad_table b
WHERE
    (b.rightcodes LIKE '%904%' OR b.rightcodes LIKE '%908%')
    AND NOT EXISTS (SELECT * FROM @bad_table xb WHERE xb.contractno = b.contractno AND (xb.rightcodes LIKE '%922%' OR xb.rightcodes LIKE '%923%'));