Sql server 使用条件运算符返回记录的T-SQL SELECT语句
我正在使用SSMS 17.9.1-我有一个带有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 提前非常感谢。制作一些数据(注意存
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%'));