将所有订单运送到纽约

Get all orders shipped to NY

orders table 有一个 billing_state 字段和一个 shipping_state 字段。我需要收到运往纽约州的订单。假设订单已开具账单并运送到纽约州。在这种情况下,billing_state 字段的值为 NY,而 ship_state 为 null。一份订单从 CA 下达并运往 NY。 billing_state 值是 CA,shipping_state 是纽约。

现在要得到两行结果的查询应该是什么?

SELECT * 
FROM orders 
WHERE dateord>='2014-02-25' 
AND dateord<='2014-02-25' 
AND activeFlag=1 
AND (ship_state='NY' 
     OR (billing_state = 'NY' AND ship_state='')) 
order by ordId  

你快到了,

SELECT * 
FROM orders 
WHERE dateord>='2014-02-25' 
AND dateord<='2014-02-25' 
AND activeFlag=1 
AND (ship_state='NY' 
     OR (billing_state = 'NY' AND ship_state IS NULL)) 
order by ordId 

对于大多数 DBMS(Oracle 除外,MySQL 被包括在内)''NULL 是不同的值。

您可能需要重新检查验证

WHERE dateord>='2014-02-25' AND dateord<='2014-02-25'

一样
WHERE dateord = '2015-02-25'

Null'' 是不同的东西。如果是实际的 null,则需要使用 is 运算符:

SELECT   * 
FROM     orders 
WHERE    dateord >= '2014-02-25' AND 
         dateord <= '2014-02-25' AND 
         activeFlag = 1 AND 
         (ship_state='NY' OR 
          (billing_state = 'NY' AND ship_state IS NULL)) 
ORDER BY ordId  

如果 ship_state 为 NULL,将它与空字符串进行比较不会生成匹配项。如果dateord是时间戳,,它包括时间部分,你还需要修改日期过滤器。

如果 ship_state 为 NULL 并且 dateord 是时间戳,请尝试以下 WHERE 语句。

WHERE (dateord >= '2014-02-25')
  AND (dateord < '2014-02-25' + INTERVAL 1 DAY)
  AND (activeFlag = 1)
  AND (COALESCE(`ship_state`, `billing_state`) = 'NY')

您应该使用 is null 而不是 = ''

尝试联合条款:

SELECT * 
FROM orders 
WHERE dateord>='2014-02-25' 
AND dateord<='2014-02-25' 
AND activeFlag=1 
AND ship_state='NY'
order by ordId

union all

SELECT * 
FROM orders 
WHERE dateord>='2014-02-25' 
AND dateord<='2014-02-25' 
AND activeFlag=1 
AND ship_state is null
AND billing_state = 'NY'
order by ordId