如果其他字段为null,则在SELECT中创建自定义字段

时间:2013-12-12 14:22:16

标签: sql oracle

这是一件看似简单的事情,但我找不到任何参考。如果另一个字段的值为null,我想在我的select语句中添加一个自定义字段。在下面我想创建一个名为'IMPACT'的字段,如果子查询中的LOCATION_ACCOUNT_ID字段为空,则显示值'Y'。我该怎么做?

SELECT FIRST_NAME,LAST_NAME,ULTIMATE_PARENT_NAME, IMPACT = IF LOCATION_ACCOUNT_ID IS NULL THEN 'Y' ELSE ''
FROM (SELECT DISTINCT A.FIRST_NAME,
A.LAST_NAME,
B.LOCATION_ACCOUNT_ID,
A.ULTIMATE_PARENT_NAME
FROM ACTIVE_ACCOUNTS A,
QL_ASSETS B
WHERE A.ACCOUNT_ID = B.LOCATION_ACCOUNT_ID(+)

3 个答案:

答案 0 :(得分:4)

使用CASE代替IF

SELECT 
    FIRST_NAME,
    LAST_NAME,
    ULTIMATE_PARENT_NAME, 
    CASE WHEN LOCATION_ACCOUNT_ID IS NULL THEN 'Y' ELSE '' END AS IMPACT
FROM (
    SELECT DISTINCT 
        A.FIRST_NAME,
        A.LAST_NAME,
        B.LOCATION_ACCOUNT_ID,
        A.ULTIMATE_PARENT_NAME
    FROM ACTIVE_ACCOUNTS A,
    QL_ASSETS B
    WHERE A.ACCOUNT_ID = B.LOCATION_ACCOUNT_ID(+)

你也应该使用LEFT JOIN语法而不是旧的(+)语法(但在这种情况下更多的是样式选择 - 它不会改变结果):

SELECT 
    FIRST_NAME,
    LAST_NAME,
    ULTIMATE_PARENT_NAME, 
    CASE WHEN LOCATION_ACCOUNT_ID IS NULL THEN 'Y' ELSE '' END AS IMPACT
FROM (
    SELECT DISTINCT 
        A.FIRST_NAME,
        A.LAST_NAME,
        B.LOCATION_ACCOUNT_ID,
        A.ULTIMATE_PARENT_NAME
    FROM ACTIVE_ACCOUNTS A
    LEFT JOIN QL_ASSETS B
        ON A.ACCOUNT_ID = B.LOCATION_ACCOUNT_ID
     )

事实上,由于您不是使用结果中B的任何列(仅检查存在),您只需使用{ {1}}:

EXISTS

答案 1 :(得分:2)

使用case声明:

SELECT FIRST_NAME,
  LAST_NAME,
  ULTIMATE_PARENT_NAME,
  CASE WHEN Location_Account_ID IS NULL THEN 'Y' ELSE '' END AS IMPACT
FROM (
  SELECT DISTINCT A.FIRST_NAME,
    A.LAST_NAME,
    B.LOCATION_ACCOUNT_ID,
    A.ULTIMATE_PARENT_NAME
  FROM ACTIVE_ACCOUNTS A,
    QL_ASSETS B
  WHERE A.ACCOUNT_ID = B.LOCATION_ACCOUNT_ID(+)
  ) a

P.S。还为派生表添加了别名,因此您不会收到错误。

答案 2 :(得分:-2)

根据您的以下陈述,我并没有完全得到您的要求

  

(如果中的LOCATION_ACCOUNT_ID字段显示值'Y'   子查询为空)

我可以建议您使用表达式。

将此语句放在表达式之间。

NVL(B.LOCATION_ACCOUNT_ID,'Y') IMPACT