web-dev-qa-db-ja.com

入れ子になったcase-when条件をpostgresqlクエリに配置する方法

クエリの入れ子になったcase when条件を記述して、あるwhen条件と別のcase条件からの値を同じ新しい列に格納します。この種の結果を取得するには、クエリを次のように記述します:

(case when sq_name_new1 like format('%%%s%%',demo.name) THEN count(sq_name_new1) else (when demo.empcode is not null then count(demo.id) End) END) AS indivisual from res_scheduledjobs

上記のクエリのdemo.name列はCTEから取得されているため、クエリ全体は次のようになります。

with demo(empcode,id,name) as               
(select hr_employee.emp_code,hr_employee.id,concat(resource_resource.name,' ',hr_employee.middle_name,' ',hr_employee.last_name) as name from hr_employee inner join  resource_resource on resource_resource.id=hr_employee.resource_id)
select demo.empcode,demo.name,sq_name_new1,(case when sq_name_new1 like format('%%%s%%',demo.name) THEN count(sq_name_new1) else (when demo.empcode is not null then count(demo.id) End) END) AS indivisual from res_scheduledjobs LEFT JOIN demo on demo.id=res_scheduledjobs.assigned_technician group by res_scheduledjobs.assigned_technician,sq_name_new1,demo.empcode,demo.name ;

最初のケースの条件が一致しない場合、(sq_name_new1)列の数をINDIVISUAL列に保存し、(demo.id)列の数をINDIVISUALに保存します。しかし、クエリを実行するとエラーがスローされます。つまり、case when条件の構文に何か問題があります。

正しい入れ子のcase-when条件を記述できるようにしてください。

12
shyarry g

CASE ... WHEN ... ENDは式です。他の式と同じようにネストできます。

CASE
     WHEN condition THEN
         CASE
             WHEN othercondition THEN
                 ....
         END
END
13
Craig Ringer

最初のセミコロン;は、@ Craig Ringerの回答のように削除する必要があります。

SELECT 
  CASE WHEN condition1 THEN
    CASE
      WHEN condition1.1 THEN
        ...
    END
  END AS column_name
FROM table_name;
1
Guoyang Qin