将所有订单运送到纽约
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
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