问题描述
select a.first_name||','||a.last_name as name,a.number as id,b.address
from student a,address b
where a.number = b.id;
Name Id Address
abc,def 100 CA
xxx,yyy 101 MA,102 PA
所以我尝试使用解码,
select decode(a.first_name||','||a.last_name,','') as name,address b
where a.number = b.id;
但是这对于所有行中的名称字段返回空值。当名称不存在时,我必须显示它的空值。我需要去掉逗号。
解决方法
NVL2()
函数,它为第一个参数的 not null
或 null
情况带来结果,非常适合您的情况,其中每当 first_name
从该列的值中删除空格后,通过函数的第二个参数 (s.first_name||','
) 不为空
SELECT NVL2(TRIM(s.first_name),s.first_name||',','')||s.last_name AS name,s."number" AS id,a.address
FROM student s
JOIN address a
ON s."number" = a.id
如果您怀疑可能有一些不可打印的字符,那么也添加一个正则表达式,例如
SELECT NVL2(TRIM(REGEXP_REPLACE(s.first_name,'[^[:print:]]')),a.address
FROM student s
JOIN address a
ON s."number" = a.id
,
为什么不使用 TRIM:
WITH demo_data AS ( SELECT 'abc' AS first_name,'def' AS last_name,100 AS id,'CA' AS address FROM DUAL UNION ALL
SELECT 'xxx' AS first_name,'yyy' AS last_name,101 AS id,'MA' AS address FROM DUAL UNION ALL
SELECT NULL AS first_name,NULL AS last_name,102 AS id,'PA' AS address FROM DUAL UNION ALL
SELECT 'ddd' AS first_name,103 AS id,'CA' AS address FROM DUAL UNION ALL
SELECT NULL AS first_name,'eee' AS last_name,104 AS id,'MA' AS address FROM DUAL )
SELECT TRIM(',' FROM first_name||','||last_name) as name,id,address
FROM demo_data;
结果:
NAME ID AD
------- ---------- --
abc,def 100 CA
xxx,yyy 101 MA
102 PA
ddd 103 CA
eee 104 MA
,
NULLIF 函数怎么样 -
select NULLIF(a.first_name||','||a.last_name,') as name,a.number as id,b.address
from student a,address b
where a.number = b.id;