2016-04-01 5 views
0

Der Versuch, eine Zeile zu haben, die je nach den gefundenen Werten 'YES' oder 'NO' anzeigt (wenn ein Baum vor dem im Argument angegebenen Datum behandelt wurde, JA, sonst NEIN).SQL - SELECT mit innerer IF oder CASE

Hier ist meine Funktion:

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; 
$$ 

Und bekomme ich folgende Fehlermeldung:

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

Wie implementieren man eine IF-Anweisung in einer SELECT?

PS: Mit postgresql 9,4

+0

Ich denke, Sie brauchen ein Semikolon nach dem END IF, um die IF EXISTS bedingte Logik zu schließen, die Sie haben. – Dresden

Antwort

0

IF ist Steuerfluß. Verwenden Sie CASE weil dies innerhalb einer SELECT Anweisung lautet:

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; 

ich auch, dass Sie eine korrelierte Unterabfrage beabsichtigen bin zu raten, eher als eine unabhängige Unterabfrage.

+0

Danke funktioniert perfekt (mit dem AND statt THEN in der WHERE-Anweisung und Entfernen Doppel THEN am Ende des Kurses). Jeden Tag lernen! Das ist, was ich bekomme, wenn ich bei IFs bleibe :) –