2016-03-30 7 views
0

COALESCE:代わりに、CASE条件(IN)と私はこのようなPostgreSQLのクエリ実行しているよ

SELECT way, way_area, 
    CASE COALESCE(landuse, leisure, highway, amenity, tourism) 
    WHEN 'industrial' THEN 'industrial' 
    WHEN 'park' THEN 'park' 
    WHEN 'common' THEN 'park' 
    WHEN 'garden' THEN 'park' 
    WHEN 'playground' THEN 'park' 
    ELSE 'other' 
    END AS class 
FROM planet_osm_polygon 

が合体した値が、値の集合であるかどうかを確認するためにINを使用するためにどのような方法がありますが別の書類を書くWHENステートメント?

WHEN x IN ('park','common','garden','playground') 

の代わりに::

WHEN 'park' THEN 'park' 
WHEN 'common' THEN 'park' 
WHEN 'garden' THEN 'park' 
WHEN 'playground' THEN 'park' 
+2

おそらく:合併(landuse、leisure、highway、amenity、tourist)= '産業'それでは '産業' 合併(landuse、leisure、highway、アメニティ、観光) '、' garden '、' playground ')THEN' park ' else' other'end class ' – xQbert

+0

@xQbert私はそれが答えであるべきだと思います。 :) – IMSoP

答えて

0

caseを使用するには、2つの方法があります:ような何か

Case X when Y then Z When A then B else C endが...

または case when X = Y and A=B then Z when X=Y and A=C then Y end

二OPTIO nはあなたに大きな柔軟性を与え、複合基準を使用することを可能にします。 そう...

CASE WHEN coalesce(landuse,leisure, highway, amenity, tourism) = 'industrial' 
    THEN 'industrial' 
    WHEN coalesce(landuse,leisure, highway, amenity, tourism) in 
        ('park','common','garden','playground') 
    THEN 'park' 
    ELSE 'other' 
END as class 
+0

このソリューションは、よりシンプルでわかりやすいようです。ありがとう! – kontextify

1

あなたの質問のように、使用がwhen x in ('a', 'b', 'c')...を使用することができますが、しかし、繰り返しを避けるために、それはこのように、インラインビューを使用することをお勧めします:

select 
    way, 
    way_area, 
    case when x in ('park','common','garden','playground') then 'park' 
     when x = 'industrial' then 'industrial' 
     else 'other' 
    end as class 
from (select way, way_area, COALESCE(landuse, leisure, highway, amenity, tourism) x 
     from planet_osm_polygon 
     where...) as t 

あなたは別名たら(xとしてここでは)coalesce(...)を使用すると、クエリで参照できます。それでcasewhenという表現で使うことができます。 incasewhenの式で使用することもできます。