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功能也不会返回所需的结果。 需要一些帮助
答案 0 :(得分: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个字段都为空...
答案 1 :(得分:0)
我怀疑问题是你没有行。当您返回包含null
列的行时,coalesce
或nvl
将完全符合您的预期。如果需要在结果集为空时返回值,则需要使用更多的技巧。你可以这样做:
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是数字或日期,那么您需要使用CAST
或TO_CHAR
将其转换为varchar2才能使其正常工作。通过UNION
合并的查询必须为每列提供相同的数据类型。
答案 2 :(得分:0)
也许尝试使用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')
答案 3 :(得分:0)
我假设您使用了您使用Oracle的NVL()
函数。我还从您的评论中注意到,您并未尝试查找所有列均为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;