2016-09-16 3 views
-3

Как вы показываете только данные «MISSING AREA» вместо включения пробелов, если area.id пуст? Я попытался использовать, где outlet.STATUS <> 0, но SQL сказал, что столбца STATUS не существует. Итак, в этом случае мой созданный столбец STATUS не может быть отфильтрован?WHERE условия в созданных столбцах в SQL

Извините за путаницу, будет выборки данных что-то вроде:

Магазины

id firm name area id    
---------------------- 
1 abc  21    
2 xyz  23    
3 def  42   

Области

id 
-- 
20 
23 
40 

соединяемых таблиц с СТАТУС:

id firm name area_id id Status 
--------------------------------------- 
1 abc  21  NULL MISSING AREA 
2 xyz  23  23  
3 def  42  NULL MISSING AREA 

Я хочу, чтобы не показать shops.id = 2 и только дисплей 1 и 3

select 
    shops.id, shops.firm_name, shops.area_id, 
    areas.id, 
    IF(areas.id, "", "MISSING AREA") as STATUS 
from 
    shops 
left join 
    areas on areas.id = shops.area_id 
where 
    shops.area_id != 0 
order by 
    STATUS asc 
+2

Пожалуйста, помечать СУБД и предоставить некоторые выборочные данные и выходные, я думаю, что это очень просто требование. – Susang

+0

Вы упомянули 'outlet.STATUS <> 0', и запрос имеет' outlets.area_id! = 0', 2 разных написания для 'outlet'. В любом случае, что это за «выпуск»? Я не вижу «выхода» в любом месте в разделах 'from',' join'. – sstan

ответ

0

Если вы хотите, чтобы фильтр на вычисляемый столбец, у вас есть два варианта:

  • Повторите выражение столбца внутри статьи WHERE - это не идеально, из-за повторения кода.
  • Оберните SELECT с вычисленным столбцом в другом SELECT и отфильтруйте внешний - это позволяет использовать одно выражение для более длинного запроса.

Вот пример второго подхода:

SELECT * FROM (
    SELECT 
     shops.id 
    , shops.firm_name 
    , shops.area_id 
    , areas.id 
    , CASE WHEN areas.id is NULL THEN 'MISSING AREA' END as STATUS 
    FROM shops 
    LEFT JOIN areas ON areas.id = shops.area_id 
) 
WHERE ... -- You can use STATUS here 
ORDER BY STATUS 
Смежные вопросы