2016-09-16 72 views
-3

如果areas.id为空,那么只显示'MISSING AREA'数据而不是包含空白?我尝试使用outlet.STATUS <> 0,但SQL表示列STATUS不存在。所以在这种情况下,我创建的STATUS列不能被过滤?SQL中创建列中的条件

很抱歉的混乱,样本数据将是这样的:

商店

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

领域

id 
-- 
20 
23 
40 

连接的表与STATUS:

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

请标记DBMS,并提供一些样品和输出数据,我认为这是很容易的要求。 – Susang

+0

你提到'outlet.STATUS <> 0',查询有'outlets.area_id!= 0',两个不同的'outlet'拼写。无论哪种方式,这个'出口'是什么?我没有在'from','join'子句中的任何地方看到'outlet'。 – 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