检查 NULL 和连接字符串的函数
Function to check for NULL and concatenating the strings
我有一个 SQL 语句,它连接了此人的 名字 和 姓氏 。我使用以下 SQL 语句。
ISNULL(FullName.FirstName, '') + ' ' + ISNULL(FullName.LastName, '')
我需要更改此设置以添加 FirstName
和 LastName
,前提是它们不是 NULL
。如果其中之一不为 NULL,则使用该值。
示例:
- 名字和姓氏为 NULL -> NULL
- 名字是约翰,姓氏是 NULL -> 约翰
- 名字为 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;
我有一个 SQL 语句,它连接了此人的 名字 和 姓氏 。我使用以下 SQL 语句。
ISNULL(FullName.FirstName, '') + ' ' + ISNULL(FullName.LastName, '')
我需要更改此设置以添加 FirstName
和 LastName
,前提是它们不是 NULL
。如果其中之一不为 NULL,则使用该值。
示例:
- 名字和姓氏为 NULL -> NULL
- 名字是约翰,姓氏是 NULL -> 约翰
- 名字为 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;