簡體   English   中英

將所有訂單發送到紐約

[英]Get all orders shipped to NY

orders表有billing_state字段和shipping_state字段。 我需要獲得運往紐約州的訂單。 假設訂單已開票並運往紐約州。 在這種情況下, billing_state字段的值為NY,ship_state為null 一個訂單從CA發出並運到紐約。 billing_state值為CA, shipping_state為NY。

現在應該在結果中獲取兩行的查詢是什么?

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而不是= ''

試試Union子句:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM