如何使用子查询替换select中的NULL值

时间:2015-08-21 21:49:32

标签: sql db2

您好我在两张桌子上进行左连接。如果特定列为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运行包含用户名的子查询,并在{{1}上匹配}。

我以为我可以做类似的事情:

A.USER_ID

但是我收到了这个错误:

CASE B.PREFERRED_NAME
     WHEN NULL THEN subquery here

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

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

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

1 个答案:

答案 0 :(得分:1)

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

此外,如果没有首选名称,您可能会将首选名称存储为空格,在这种情况下,您可以使用NULLIF函数将其转换为{{1} },适用于您的NULL

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

COALESCE

如果您知道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

您收到错误的原因是因为您无法在NULL声明中使用CASE。如果您想要NULL案例,那么您必须像@Abecee在CASE WHEN B.PREFERRED_NAME IS NULL THEN ...

的评论中所说的那样做