用case写一个sql语句

时间:2014-06-17 15:14:52

标签: sql oracle-sqldeveloper

我正在尝试编写一个sql语句来获取表中两列的描述。但是,a.code_2列中的某些行为null,并且不需要获取描述。我的sql语句如下所示。它只捕获code_1和code_2中具有值的列,而不是a.code_2为null的行。

 SELECT ID, CODE_1, B.CODE_DESC, CODE_2, C.CODE_DESC
     FROM TBLCODE A, TBLDESC B, TBLDESC C
     WHERE A.CODE_1 = B.CODE1
     AND  A.CODE_2 = (CASE WHEN a.CODE_2 IS NULL THEN '' ELSE C.CODE1 END);

2 个答案:

答案 0 :(得分:0)

您需要阅读联接(内部和外部)。我也不完全确定你在使用TBLDESC C做什么,但这是我最好的猜测。左连接意味着“显示左侧的所有列,无论它们是否加入到右侧的任何内容”。

SELECT ID, CODE_1, B.CODE_DESC, CODE_2, B.CODE_DESC
FROM TBLCODE AS A
LEFT JOIN TBLDESC AS B ON A.CODE_1 = B.CODE1

答案 1 :(得分:0)

看起来你想要TBLDESC的{​​{1}}表的内连接,只要它永远不为空;以及CODE_1的同一个表的外部联接。当CODE_2为null且找不到任何内容时,CODE_2将为null - 但将其作为外连接意味着C.CODE_DESC记录不会被丢弃,这就是你现在从两个内在联系中看到了:

TBLCODE

如果SELECT A.ID, A.CODE_1, B.CODE_DESC AS DESC_1, A.CODE_2, C.CODE_DESC AS DESC_2 FROM TBLCODE A JOIN TBLDESC B ON B.CODE1 = A.CODE_1 LEFT JOIN TBLDESC C ON C.CODE1 = A.CODE_2; 可能为null,则将它们设为CODE_1

如果您不想两次击中表格,可以使用单个外部联接,然后LEFT JOIN来决定哪个去哪里,但是它有点乱;对于小型查找表,它可能不值得:

CASE

SQL Fiddle