sql解码功能

问题描述

我有一个连接 2 个表并显示名称查询,如下所示:

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 nullnull 情况带来结果,非常适合您的情况,其中每当 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

Demo

,

为什么不使用 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;