[英]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.