【发布时间】:2020-11-09 23:04:47
【问题描述】:
我有一份订单清单。
我的表中有一个“保留”列,其中包含连接的保留代码。
我想返回所有行,包括价格为“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”且 onhold=Null 的行。这让我相信我试图用括号进行的分组不起作用。
我怎样才能拥有 3 组配对标准?
更新:所以,为了解决问题,我更新了查询只是为了说:
如果不是 ( onhold LIKE '%Pricing Hold%' onhold LIKE '%Program Hold%' onhold LIKE '%Program Hold%' )
返回的只是 1 条保留值为“.New:Line Hold”的记录,但不是保留值为 Null 的记录。所以现在我开始思考我是如何使用“NOT LIKE '%%'”的,它用空白的“onhold”来抑制行。
【问题讨论】:
-
您更新的查询在语法上不正确,将产生错误而不是返回任何行。但是您的查询对您的数据非常敏感,因此强烈建议您发布MCVE。在更新之前您从未提及 NULL - NULL 永远不等于也不等于其他任何东西。这是编写 tsql 时要学习的一个重要概念。
-
注意@Smor 他在原始问题中确实提到了 NULL:“这不包括价格为 '0.01' 的所有东西,包括我在价格 ='0.01' 和 onhold= 处的行空。”确实,我相信
onhold=NULL是唯一的情况 OP 的查询不起作用 - 这是这个问题的核心问题。
标签: sql sql-server string where-clause sql-like