连接字符串并合并
concatenate strings and coalesce
我有一个从三个不同的 table 中选择行的查询:
TableA
、TableB
和 TableC
。
我查询的一个字段必须是每个 table 中的字段 Name
的串联,如以下别名:
SELECT
A.Name,
B.Name,
C.Name,
CONCAT(A.Name, ' / ', B.Name, ' / ', C.Name) AS Full_name
FROM ...
查询使用 LEFT OUTER JOIN
连接三个 table。在某些情况下,如果 table 之一没有以下条目,我会得到奇怪的结果 table:
--------------------------
|Table A |Table B|Table C|
--------------------------
|My |Name | |
--------------------------
|My | |Is |
--------------------------
|My |Name |Is |
--------------------------
尾随 / 像这样可见:
1) My / Name /
2) My / / Is
3) My / Name / Is
我应该生成以下结果,但我不想使用 CASE,所以我想知道我是否可以同时使用 COALESCE、ISNULL 和 CONCAT
预期结果
1) My / Name
2) My / Is
3) My / Name / Is
添加“/”和名称时,如果名称为空,则返回空值。因此,您只需添加即可删除它们。
试试这个:
SELECT
A.Name,
B.Name,
C.Name,
CONCAT(A.Name, ' / '+ B.Name, ' / '+ C.Name) AS Full_name
FROM
...
样本在 Fiddle.
另一种方法:
SELECT
A.Name as AName,
B.Name as BName,
C.Name as CName,
CONCAT(A.Name,
CASE WHEN B.Name IS NOT NULL THEN ' / ' END,
B.Name, CASE WHEN C.Name IS NOT NULL THEN ' / ' END,
C.Name) AS Full_name
FROM
......
结果:
ANAME BNAME CNAME FULL_NAME
My Name (null) My / Name
My (null) Is My / Is
My Name Is My / Name / Is
SQL Fiddle 中的示例输出。
我会采用的方法是:
STUFF(CONCAT(' / ' + A.Name, ' / ' + B.Name, ' / ' + C.Name), 1, 3, '')
前提是,如果您的任何值是 NULL
,那么 ' / ' + NULL
也将为空,但是通过将 ' / '
附加到所有内容的开头,您就知道您将永远以 /
开头,因此您可以使用 STUFF 函数安全地删除前 3 个字符。
一个稍微扩展的例子是
SELECT *,
[Concat] = STUFF(CONCAT(' / ' + A, ' / ' + B, ' / ' + C, ' / ' + D), 1, 3, '')
FROM (VALUES
('A', 'B', NULL, 'D'),
('A', NULL, 'C', NULL),
('A', 'B', 'C', NULL),
('A', 'B', 'C', 'D'),
('A', NULL, NULL, 'D'),
(NULL, NULL, NULL, NULL),
(NULL, 'B', 'C', NULL)
) T (A, B, C, D);
我有一个从三个不同的 table 中选择行的查询:
TableA
、TableB
和 TableC
。
我查询的一个字段必须是每个 table 中的字段 Name
的串联,如以下别名:
SELECT
A.Name,
B.Name,
C.Name,
CONCAT(A.Name, ' / ', B.Name, ' / ', C.Name) AS Full_name
FROM ...
查询使用 LEFT OUTER JOIN
连接三个 table。在某些情况下,如果 table 之一没有以下条目,我会得到奇怪的结果 table:
--------------------------
|Table A |Table B|Table C|
--------------------------
|My |Name | |
--------------------------
|My | |Is |
--------------------------
|My |Name |Is |
--------------------------
尾随 / 像这样可见:
1) My / Name /
2) My / / Is
3) My / Name / Is
我应该生成以下结果,但我不想使用 CASE,所以我想知道我是否可以同时使用 COALESCE、ISNULL 和 CONCAT
预期结果
1) My / Name
2) My / Is
3) My / Name / Is
添加“/”和名称时,如果名称为空,则返回空值。因此,您只需添加即可删除它们。
试试这个:
SELECT
A.Name,
B.Name,
C.Name,
CONCAT(A.Name, ' / '+ B.Name, ' / '+ C.Name) AS Full_name
FROM
...
样本在 Fiddle.
另一种方法:
SELECT
A.Name as AName,
B.Name as BName,
C.Name as CName,
CONCAT(A.Name,
CASE WHEN B.Name IS NOT NULL THEN ' / ' END,
B.Name, CASE WHEN C.Name IS NOT NULL THEN ' / ' END,
C.Name) AS Full_name
FROM
......
结果:
ANAME BNAME CNAME FULL_NAME
My Name (null) My / Name
My (null) Is My / Is
My Name Is My / Name / Is
SQL Fiddle 中的示例输出。
我会采用的方法是:
STUFF(CONCAT(' / ' + A.Name, ' / ' + B.Name, ' / ' + C.Name), 1, 3, '')
前提是,如果您的任何值是 NULL
,那么 ' / ' + NULL
也将为空,但是通过将 ' / '
附加到所有内容的开头,您就知道您将永远以 /
开头,因此您可以使用 STUFF 函数安全地删除前 3 个字符。
一个稍微扩展的例子是
SELECT *,
[Concat] = STUFF(CONCAT(' / ' + A, ' / ' + B, ' / ' + C, ' / ' + D), 1, 3, '')
FROM (VALUES
('A', 'B', NULL, 'D'),
('A', NULL, 'C', NULL),
('A', 'B', 'C', NULL),
('A', 'B', 'C', 'D'),
('A', NULL, NULL, 'D'),
(NULL, NULL, NULL, NULL),
(NULL, 'B', 'C', NULL)
) T (A, B, C, D);