【问题标题】:How to replace NULL value in select with subquery如何用子查询替换select中的NULL值
【发布时间】:2015-08-21 21:49:31
【问题描述】:

您好,我正在对两个表执行左连接。如果特定列为 NULL,我想运行子查询以从完全不同的表中获取值。这是我现在拥有的:

SELECT A.ACCOUNT_NUM, A.USER_ID, 
   CASE B.PREFERRED_NAME
        WHEN '' THEN RTRIM(B.FIRST_NAME) || ' ' || B.LAST_NAME
        ELSE RTRIM(B.PREFERRED_NAME) || ' ' || B.LAST_NAME 
   END AS NAME
FROM TABLE_A A
LEFT JOIN TABLE_B B
ON A.USER_ID = B.USER_ID

TABLE_B 有时不包含与TABLE_A 匹配的记录,因此我想从TABLE_C 运行一个包含用户名并将匹配A.USER_ID 的子查询。

我想我可以这样做:

CASE B.PREFERRED_NAME
     WHEN NULL THEN subquery here

但我收到此错误:

ERROR [42703] [IBM][DB2] SQL0206N  "NULL" is not valid in the context where it is used.

可能是因为该列不允许使用 NULL。

已解决 谢谢您的帮助。这就是我解决问题的方法:

SELECT A.ACCOUNT_NUM, A.USER_ID, 
CASE 
    WHEN B.PREFERRED_NAME IS NULL THEN C.USER_ID
    WHEN B.PREFERRED_NAME IS NOT NULL THEN 
         CASE PREFERRED_NAME
         WHEN '' THEN RTRIM(B.FIRST_NAME) || ' ' || B.LAST_NAME
         ELSE RTRIM(B.PREFERRED_NAME) || ' ' || B.LAST_NAME 
         END
END AS NAME
FROM TABLE_A A
LEFT JOIN TABLE_B B
ON A.USER_ID = B.USER_ID
JOIN TABLE_C C
ON A.USER_ID = C.USER_ID

【问题讨论】:

  • 不确定 DB2 的细节。你试过像CASE WHEN B.PREFERRED_NAME = '' THEN ... WHEN B.PREFERRED_NAME IS NULL THEN ...这样重写吗?但是,“[...] 因为该列不允许 NULL”到底是什么意思。

标签: sql db2


【解决方案1】:

根据您的查询,您可能只需将第三个表添加为另一个 LEFT JOIN,然后将您想要的列添加到 COALESCE 函数:

此外,如果没有空格,您似乎将首选名称存储为空格,在这种情况下,您可以使用NULLIF 函数将其转换为NULL,这将与您的@ 一起使用987654325@.

这是我的意思的一个例子:

SELECT
     A.ACCOUNT_NUM
    ,A.USER_ID
    ,COALESCE(
         NULLIF(B.PREFERRED_NAME,'')
        ,B.FIRST_NAME
        ,C.OTHER_NAME
    ) || ' ' || B.LAST_NAME AS NAME
FROM TABLE_A A
LEFT JOIN TABLE_C C
  ON C.USER_ID = A.USER_ID
LEFT JOIN TABLE_B B
  ON A.USER_ID = B.USER_ID

如果您知道C 中总会有一行与A 匹配,那么您可以将其转换为常规(内部)JOIN


您收到错误的原因是您不能像在CASE 语句中那样使用NULL。如果您想拥有NULL 的案例,那么您必须像@Abecee 在CASE WHEN B.PREFERRED_NAME IS NULL THEN ... 的评论中所说的那样进行操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多