【问题标题】:How to display a message when all columns values are null当所有列值为空时如何显示消息
【发布时间】:2015-03-25 03:52:10
【问题描述】:
SELECT  NVL(T1.C1, 'NO RECORDS'), T1.C2, T2.C3, T1.C4  

FROM TEMP T1, TEMP_1 T2

WHERE
  T1.C2 = T2.C2
  AND T1 IN ( 'T001','T002')

  ;

我得到了列的所有空值,我可以做些什么来显示一条消息,我尝试使用 Coalesce 它不能正常工作。 NVL 函数也不会返回所需的结果。 需要帮助

【问题讨论】:

  • 你的数据库是什么?

标签: sql oracle coalesce


【解决方案1】:

我们不知道您使用的数据库,但以下内容应该适合您:

SELECT COALESCE(T1.C1,T1.C2,T2.C3,T1.C4 'NO RECORDS')
FROM TEMP T1, TEMP_1 T2
WHERE T1.C2 = T2.C2 AND T1 IN ( 'T001','T002')

coalesce 获取可变数量的参数并返回第一个非 null :

COALESCE( expr1, expr2, ... expr_n )

所以在你的情况下,如果你得到“没有记录”,那么所有 4 个字段都是空的......

【讨论】:

    【解决方案2】:

    我怀疑问题在于您没有行。当您返回带有 null 列的行时,coalescenvl 将完全符合您的预期。如果需要在结果集为空时返回值,则需要使用更多技巧。你可以这样做:

    SELECT NVL (t1.c1, 'NO RECORDS'),
           t1.c2,
           t2.c3,
           t1.c4
    FROM   temp t1, temp_1 t2
    WHERE  t1.c2 = t2.c2 AND t1 IN ('T001', 'T002')
    UNION ALL
    SELECT 'NO_RECORDS',
           NULL,
           NULL,
           NULL
    FROM   DUAL
    WHERE  NOT EXISTS
              (SELECT *
               FROM   temp t1, temp_1 t2
               WHERE  t1.c2 = t2.c2 AND t1 IN ('T001', 'T002'));
    

    但是,如果它打算由某处的代码解释,您最好确定没有通过可用元数据返回任何行,而不是通过魔法值返回。

    如果 c1 是数字或日期,那么您需要使用 CASTTO_CHAR 将其转换为 varchar2 才能使其正常工作。通过UNION 合并的查询每列必须具有相同的数据类型。

    【讨论】:

    • 是的,你说得对,我没有行,这是我查询的预期结果。然而;在这种情况下,我必须显示“未找到记录”。我尝试使用您的技巧,但它会抛出错误消息,“表达式必须具有与相应表达式相同的数据类型”
    【解决方案3】:

    也许尝试使用 CASE ?

    SELECT CASE 
            WHEN T1.C1 IS NULL
                THEN 'NO RECORDS'
            ELSE T1.C1
            END,
        T1.C2,
        T2.C3,
        T1.C4
    FROM TEMP T1
    INNER JOIN TEMP_1 T2
        ON T1.C2 = T2.C2
    WHERE T1 IN (
            'T001',
            'T002'
            );
    

    另外,不知道我是否理解这句话T1 IN ( 'T001','T002')

    【讨论】:

      【解决方案4】:

      我假设您使用的是 Oracle 的 NVL() 函数。我还从您的 cmets 中注意到,您不是在尝试查找所有列都是 NULL 的行,而是在一个表中查找另一个表中没有相应记录的记录。这可以通过多种方式完成,一种是使用NOT EXISTS

      SELECT t1.c1
        FROM t1
       WHERE t1.c1 IN ('T001','T002')
         AND NOT EXISTS ( SELECT 1 FROM t2
                           WHERE t2.c2 = t1.c1 );
      

      或者你可以使用外连接:

      -- ANSI syntax
      SELECT t1.c1
        FROM t1 LEFT JOIN t2
          ON t1.c1 = t2.c2
       WHERE t1.c1 IN ('T001','T002')
         AND t2.c2 IS NULL;
      
      -- Old Oracle syntax
      SELECT t1.c1
        FROM t1, t2
       WHERE t1.c1 IN ('T001','T002')
         AND t1.c1 = t2.c2(+)
         AND t2.c2 IS NULL;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多