我有一个订单列表。
我的表中有一个"挂起"列,其中包含串联的挂起代码。
我想返回所有行,包括价格为"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"的EVERYTHING,包括我的一行,其中价格为".01",onhold为Null。这让我相信,我试图用括号进行的分组不起作用。
我怎样才能有3组成对的标准?
更新:所以,为了排除故障,我更新了查询,只是说:
哪里没有(持有LIKE"%定价持有%"挂起LIKE"%程序挂起%"挂起LIKE"%程序挂起%")
所有返回的都是一个保持值为"的记录;。New:Line Hold";,但不包括具有Null保留值的记录。所以现在这让我思考我是如何使用";不喜欢"%%";,其抑制具有空白"的行;"暂停";。
我想返回所有行,包括价格为"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%'
)
)
或者,假设Price
:中没有NULL
值
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
看起来像一个数值,所以它应该这样存储(如果不是这样,你可以恢复它(。
据我所知,您希望排除的唯一行是那些price=0.01并且在onhold中的值是三个赞之一的行。
在下面的示例数据中,结果中只应排除第一行
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, 'Pricing Hold'), -- Included
(0.01, NULL), -- Included
(0.01, 'No hold'), -- Included
(0.02, NULL); -- Included
在您的代码中,不包括第三行0.01, NULL
。
一种方法是对上面的内容进行调整,以明确包含/允许NULLS,例如
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<gt;篡改我的结果。值得检查一下其他答案,它们是如何处理NULL值的。
我认为这就是逻辑:
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
(。