2016-04-01 110 views
0

Bulunan değerlere bağlı olarak 'EVET' veya 'HAYIR' gösterecek bir satır oluşturmaya çalışın (bir ağaç argümanda verilen tarihten önce işleme tabi tutulduysa EVET HAYIR olursa).SQL - iç IF veya CASE ile SELECT

İşte benim işlevi var:

CREATE OR REPLACE FUNCTION tree_care(care_date DATE) 
RETURNS TABLE(name VARCHAR(32), type VARCHAR(32), treated TEXT) AS 
$$ 
BEGIN 
RETURN QUERY 
SELECT tree.name, 
     tree.type, 
     IF EXISTS (SELECT * FROM treatment 
        JOIN tree ON tree.name = treatment.tree_name 
        WHERE treatment.date < care_date) THEN 
      'YES'::text 
     ELSE 
      'NO'::text 
     END IF 
FROM tree; 
END; 
$$ 

Ve aşağıdaki hatayı alıyorum:

ERROR: syntax error at or near "EXISTS" 
LINE 8:   IF EXISTS (SELECT * FROM treatment 

İnsan nasıl SELECT'in içindeki bir IF deyimi uyguluyor mu?

PS: postgresql 9,4

+0

IF IFISTS koşullu mantığını kapatmak için SON IF'den sonra noktalı virgül kullanmanız gerektiğini düşünüyorum. – Dresden

cevap

0

IF kullanma kontrol akışıdır. Ben de doğrusu bağımsız alt sorgu yerine, ilişkili alt sorgu niyetinde olduğunu tahmin ediyorum

SELECT tree.name, 
     tree.type, 
     (CASE WHEN EXISTS (SELECT 1 
          FROM treatment 
          WHERE tree.name = treatment.tree_name AND 
           treatment.date < care_date 
         ) THEN 
      THEN 'YES'::text 
      ELSE 'NO'::text 
     END) as Flag 
FROM tree; 

: Bu bir SELECT ifadesi içinde olduğu için CASE kullanın.

+0

Teşekkürler mükemmel çalıştı (WHERE ifadesinde THEN yerine AND ile ve sonunda THEN çift çıkarmadan). Her gün öğrenme! IFs'e yapıştığım şey budur :) –

İlgili konular