2016-04-01 90 views
0

试图找到一行,根据找到的值显示'YES'或'NO'(如果树已在参数中给出的日期之前处理过,请说YES否)。SQL - SELECT with inner IF or CASE

这里是我的功能:

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

而且我得到以下错误:

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

怎样才能实现一个SELECT内的IF语句?

PS:使用PostgreSQL 9.4

+0

我认为在END IF之后需要一个分号才能关闭IF EXISTS条件逻辑。 – Dresden

回答

0

IF是控制流程。使用CASE因为这是一个SELECT语句中:

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; 

我也猜你打算相关子查询,而不是一个独立的子查询。

+0

谢谢你完美的工作(在WHERE语句中用AND代替THEN,在课程结束时删除双THEN)。每天学习!这就是我坚持IFs的原因:) –