如何解决3套配对排除标准
我有一个订单清单。
我的表格中有一个“保留”列,其中包含连接的保留代码。
我想返回所有行,包括价格为“ 0.01”的行,除非价格为“ 0.01”的行在OnHold列的正文中具有3个保留代码之一。
我尝试过这种方式:
Select *
From Table
Where NOT (Price='0.01' AND onhold LIKE '%Pricing Hold%')
AND NOT (Price='0.01' AND onhold LIKE '%Program Hold%')
AND NOT (Price='0.01' AND onhold LIKE '%Program Hold%')
这不包括价格为“ 0.01”的所有内容,包括行中有价格为“ 0.01”且保留为空的行。这使我相信我要对括号进行的分组无法正常工作。
如何获得3套配对条件?
更新:因此,要进行故障排除,我只是说了更新查询:
不是( 保持喜欢的“%定价保持%” 保持“喜欢”%Program Hold% 保持“喜欢”%Program Hold% )
所有返回的内容是1个保留值为“ .New:Line Hold”的记录,但不包含保留值为Null的记录。因此,现在让我开始思考如何使用“ NOT LIKE'%%'”,它禁止使用空白“ onhold”的行。
解决方法
我想返回所有行,包括价格为“ 0.01”的行,除非价格为“ 0.01”的行在OnHold列的正文中具有3个保留代码之一。
您可以这样表达:
WHERE NOT (
Price = 0.01
AND (
onhold LIKE '%Pricing Hold%'
OR onhold LIKE '%Program Hold%'
OR onhold LIKE '%Program Hold%'
)
)
或者,假设NULL
中没有Price
个值:
WHERE
Price <> 0.01
OR (
onhold NOT LIKE '%Pricing Hold%'
AND onhold NOT LIKE '%Program Hold%'
AND onhold NOT LIKE '%Program Hold%'
)
)
我删除了'0.01'
周围的单引号:Price
看起来像是一个数字值,因此应该这样存储(如果不是这样,可以将其还原)。
我认为这是逻辑:
Where Price = '0.01' AND
onhold NOT LIKE '%Pricing Hold%' AND
onhold NOT LIKE '%Program Hold%' AND
onhold NOT LIKE '%Program Hold%'
我建议使用Price = 0.01
。如果将price
存储为字符串,则应修复数据模型,以便将值存储为数字(可能是decimal
/ numeric
)。
据我所知,您希望排除的唯一行是价格= 0.01且保留值是三个赞之一的行。
在下面的示例数据中,结果中仅应排除第一行
CREATE TABLE #Test (price decimal(10,2),onhold varchar(30));
INSERT INTO #Test (price,onhold)
VALUES -- DESIRED RESULT
(0.01,'Pricing Hold'),-- Not included
(0.02,-- Included
(0.01,NULL),'No hold'),-- Included
(0.02,NULL); -- Included
在您的代码中,不包括第三行0.01,NULL
。
一种方法是对上述内容进行调整,以明确包含/允许NULL,例如
SELECT *
FROM #Test
WHERE Price <> 0.01 OR Price IS NULL
OR onhold IS NULL
OR NOT (
onhold LIKE '%Pricing Hold%'
OR onhold LIKE '%Program Hold%'
OR onhold LIKE '%Program Hold%'
);
您还可以使用EXCEPT子句-可读性更高,但效率可能更低
SELECT *
FROM #Test
EXCEPT
SELECT *
FROM #Test
WHERE Price = 0.01
AND (onhold LIKE '%Pricing Hold%'
OR onhold LIKE '%Program Hold%'
OR onhold LIKE '%Program Hold%'
);
以上两者均返回以下内容
price onhold
0.01 NULL
0.01 No hold
0.02 NULL
0.02 Pricing Hold
这是我的结果的db<>fiddle。值得检查其他答案如何处理NULL值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。