2015-02-25 2 views
2

orders стол имеет billing_state и shipping_state поле. Мне нужно получить заказы, которые были отправлены в штат Нью-Йорк. Предположим, что заказ был выставлен и отправлен в штат Нью-Йорк. В этом случае поле billing_state имеет значение NY, а ship_state - null. Один заказ был отправлен из ЦА и отправлен в Нью-Йорк. billing_state Значение - CA и shipping_state - NY.Получить все заказы отправлены в 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 
+0

'dateord> = '2014-02-25' AND dateord <= '2014-02-25' 'не имеет большого смысла. –

+0

Чтобы быть более конкретным, это то же самое, что сказать 'dateord = '2014-02-25'' –

+0

См. COALESCE(). – Strawberry

ответ

2

If ship_state является NULL, сравнивая его с пустой строкой не будет генерировать матч. Если dateord - это метка времени, , то есть, она включает временную часть, вам также потребуется изменить фильтр даты.

Попробуйте выполнить следующую инструкцию WHERE, если ship_state имеет значение NULL, а dateord - это метка времени.

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

Вы были почти там,

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 

В большинстве СУБД (Oracle является исключением, MySQL включаются) '' и NULL разные значения.

Вы можете повторно проверить проверки достоверности

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

Как это то же самое сказать

WHERE dateord = '2015-02-25' 
+0

Я бы уточнил, что для * С большинством СУБД (Oracle является исключением) * если бы это был я. :-) –

+0

@KenWhite Всегда лучше уточнить :) Спасибо. –

+0

@KenWhite Хорошее замечание, но я бы не стал поощрять кого-либо использовать это своеобразное поведение. – Tarik

2

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 
+0

Получение нулевых строк. Ну, в первом случае поле ship_state пусто. в нем нет никакой ценности. = '' и имеет значение NULL, оба не работают –

0

Вы должны использовать is null вместо = ''.

0

Try пункт Союз:

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 
+0

Порядок по предложению здесь порождает ошибку. После удаления предложения «order by» все еще нулевые строки. Результат должен составлять 2 строки. –

+0

удалить order by clause и заменить ship_state = '' to ship_state null – segaurav

Смежные вопросы