Postgres-在CASE WHEN中使用select语句

use*_*426 5 postgresql

内部条件条件下,我正在执行select语句,并且如果返回任何内容,那么我需要获取它的值,但是会出错

ERROR:  missing FROM-clause entry for table "us"
Run Code Online (Sandbox Code Playgroud)

查询是..

SELECT u.user_id,
       CASE
           WHEN
                  (SELECT us.attr_value
                   FROM user_setting us
                   WHERE us.user_id = u.user_id) IS NOT NULL THEN us.attr_value
           ELSE
                  (SELECT gus.attr_value
                   FROM global_user_setting gus
                   WHERE gus.attr_key='key')
       END
FROM user u
WHERE u.user_id IN (1,
                          2,3)
Run Code Online (Sandbox Code Playgroud)

错误来自于IS NOT NULL THEN us.attr_value我理解了这个问题,但找不到如何在select语句之外获取该值?

Dir*_*irk 6

尝试:

COALESCE((SELECT us.attr_value
               FROM user_setting us
               WHERE us.user_id = u.user_id),
         (SELECT us.attr_value
               FROM global_user_setting gs
               WHERE gus.attr_key='key'))
Run Code Online (Sandbox Code Playgroud)

代替。该问题的原因是,es别名的绑定在子选择之外不可见(因为它在“标量”上下文中使用)。整个子选择基本上是单个表达式,它将产生单个值。

另一种(恕我直言更好的方法)是在enrollment_settings表上左联接:

SELECT u.user_id,
       COALESCE(us.attr_value, (SELECT gus.attr_value
                                FROM global_user_setting gs
                                WHERE gus.attr_key='key'))
FROM user u LEFT JOIN user_settings es ON us.user_id = u.user_id
WHERE u.user_id IN (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

我在这里假设,此联接最多可在的每一行中产生一行user。