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"的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(。

最新更新