检查 NULL 和连接字符串的函数

Function to check for NULL and concatenating the strings

我有一个 SQL 语句,它连接了此人的 名字 姓氏 。我使用以下 SQL 语句。

ISNULL(FullName.FirstName, '') + ' ' + ISNULL(FullName.LastName, '')

我需要更改此设置以添加 FirstNameLastName,前提是它们不是 NULL。如果其中之一不为 NULL,则使用该值。

示例:

  1. 名字和姓氏为 NULL -> NULL
  2. 名字是约翰,姓氏是 NULL -> 约翰
  3. 名字为 NULL,姓氏为 Doe -> Doe

->表示结果

实际上,如果您只是将当前表达式包裹在 TRIM() 中,它应该会给您想要的行为:

SELECT TRIM(ISNULL(FullName.FirstName, '') + ' ' +
            ISNULL(FullName.LastName, '')) AS FullName
FROM yourTable;

如果只有名字或姓氏存在,您的原始表达式将留下悬空 leading/trailing space。对 TRIM() 的调用通过删除这个额外的 space.

修复了这个问题

您可以使用简单的 case 语句来解决这个问题:

    create table emp (emp_id int4, fname varchar(10), lname varchar(10));
    
    insert into emp (emp_id) values(1);
    insert into emp (emp_id,fname) values(2, 'John');
    insert into emp (emp_id,lname) values(3, 'Doe');
    insert into emp (emp_id,fname,lname) values(4, 'John', 'Doe');
    
    
    select emp_id,fname, lname, 
    case 
        WHEN FNAME is not null and LNAME is not null then 
            FNAME||' '||LNAME
        WHEN FNAME is not null and LNAME is NULL then 
            FNAME
        WHEN FNAME is null and LNAME is not NULL then 
            LNAME
        else null
        end as FULL_NAME
    from emp;

  • 使用 CONCAT() 进行连接,没有任何 NULL 问题
  • TRIM() 删除一个或两个字段缺失时的任何空格
  • NULLIF() 如果名字和姓氏都是 NULL,则将 '' 替换为 NULL 失踪

SQL 服务器 2017+ 解决方案

DROP TABLE IF EXISTS #emp
CREATE TABLE #emp (ID INT IDENTITY(1,1), FirstName VARCHAR(25), LastName VARCHAR(25));
    
INSERT INTO #emp 
VALUES(null,null)
,('John',null)
,('Doe',null)
,('John', 'Doe');

SELECT FullName = NULLIF(TRIM(CONCAT(FirstName,' ',LastName)),'')
    ,*
FROM #emp

更好的 SQL Server 2017 解决方案:

使用新的 CONCAT_WS 函数,它与分隔符连接,忽略空值

CREATE TABLE #emp (ID INT IDENTITY(1,1), FirstName VARCHAR(25), LastName VARCHAR(25));
    
INSERT INTO #emp 
VALUES(null,null)
,('John',null)
,('Doe',null)
,('John', 'Doe');

SELECT FullName = CONCAT_WS(' ', FirstName, LastName)
    ,*
FROM #emp;

db<>fiddle