如何在 Azure Synapse 上将多列连接成一列

问题描述 投票:0回答:1

我正在尝试在 Azure Synapse Serverless 上使用

WHEN
条件对某些列进行 concat,但是有一个问题,在这个新专栏中它每次只显示一列并且 concat 函数不起作用。

代码如下:

SELECT 
    Categorie, ParentGuid,
    COALESCE(CAST(EnfantGuid_7 AS nvarchar(1000)),
             CAST(EnfantGuid_6 AS nvarchar(1000)), 
             CAST(EnfantGuid_5 AS nvarchar(1000)), 
             CAST(EnfantGuid_4 AS nvarchar(1000)), 
             CAST(EnfantGuid_3 AS nvarchar(1000)), 
             CAST(EnfantGuid_2 AS nvarchar(1000)),
             CAST(EnfantGuid_1 AS nvarchar(1000))) EnfantGuid,
    CASE 
        WHEN EnfantGuid_7 IS NOT NULL 
            THEN CONCAT_WS(', ', CAST(EnfantGuid_1 AS nvarchar(1000)), CAST(EnfantGuid_2 AS nvarchar(1000)), CAST(EnfantGuid_3 AS nvarchar(1000)), CAST(EnfantGuid_4 AS nvarchar(1000)), CAST(EnfantGuid_5 AS nvarchar(1000)), CAST(EnfantGuid_6 AS nvarchar(1000)))
        WHEN EnfantGuid_6 IS NOT NULL 
            THEN CONCAT_WS(', ', EnfantGuid_1, EnfantGuid_2, EnfantGuid_3, EnfantGuid_4, EnfantGuid_5)
        WHEN EnfantGuid_5 IS NOT NULL 
            THEN CONCAT_WS(', ',EnfantGuid_1, EnfantGuid_2, EnfantGuid_3, EnfantGuid_4)
        WHEN EnfantGuid_4 IS NOT NULL 
            THEN CONCAT_WS(', ',EnfantGuid_1, EnfantGuid_2, EnfantGuid_3)
        WHEN EnfantGuid_3 IS NOT NULL 
            THEN CONCAT_WS(', ', CAST(EnfantGuid_2 AS nvarchar(1000)), CAST(EnfantGuid_1 AS nvarchar(1000)))
        ELSE EnfantGuid_1
    END AS [Path],  
    EnfantGuid_1, EnfantGuid_2, EnfantGuid_3

CASE WHEN
条件内的所有列都是
UniqueIdentifier
类型。我试图将它们转换为如下所示的字符串,但没有结果..

有人知道这个问题吗?

结果样本:

类别 家长指导 儿童指南 路径 EnfantGuid_1 EnfantGuid_2 EnfantGuid_3 EnfantGuid_4 EnfantGuid_5 EnfantGuid_6 EnfantGuid_7
a 432025b5-5a5b 36d9d9b3-5a5b c4cae4b5-5a5b c4cae4b5-5a5b 66d9d9b3-5a5b 36d9d9b3-5a5b

在这一行 Path 必须包含 EnfantGuid_1 + EnfantGuid_2 但它只有 Enfant_Guid1 ==> 最后一个

CASE WHEN
条件

sql sql-server concatenation string-concatenation azure-synapse
1个回答
0
投票

将 else 部分中的 EnfantGuid_1 字段的数据类型转换为 varchar 数据类型。当使用 case when 语句定义新列时,该列的数据类型是 else 部分中表达式的数据类型。

    case when .....
        ......     
         ELSE 
            CAST(EnfantGuid_1 AS nvarchar(1000))
    END AS [Path]

我用样本数据试过了。

create table tab1 ( v1 uniqueidentifier null, v2 uniqueidentifier null, v3 uniqueidentifier null, v4 uniqueidentifier null)
insert into tab1 values(newid(),newid(),newid(),newid());
insert into tab1 values(newid(),newid(),newid(),null);
insert into tab1 values(newid(),newid(),null,null);
select * from tab1
v1 v2 v3 v4
d9a9b947-6c4f-47bb-b88b-d59d6e50a611 ee3d9a9e-1b13-4189-9aa2-01a27c917cf8 2f0f4ae0-2251-45d2-8428-44061a6d84eb 586df0a6-7663-4130-9bb1-e69cb61265d1
10e06207-39f6-4de1-b172-f8f42274c3fa 0d14106c-06b7-4218-a396-574c5d48157b fbd952ef-5364-4d87-8473-b0545cf5ed59
6f957995-8717-4bc7-8d75-0bd7d195a6c5 c2128d35-5b6f-4b60-bb75-f2b4f6a28ad7

Else中的表达式是uniqueidentifier类型:

select 
  case 
  when v4  is not null
   then concat_ws(', ', v1, v2, v3)
  when v3 is not null
   then concat_ws(', ', v1, v2)
  else
   v1
  end as concat_column 
from tab1
concat_column
d9a9b947-6c4f-47bb-b88b-d59d6e50a611
10e06207-39f6-4de1-b172-f8f42274c3fa
6f957995-8717-4bc7-8d75-0bd7d195a6c5

Else中的表达式是varchar类型:

select 
  case when v4  is not null
   then concat_ws(', ', v1, v2,v3)
  when v3 is not null
   then concat_ws(', ', v1, v2)
  else
   cast(v1 as varchar(100))
  end as concat_column 
from tab1
concat_column
D9A9B947-6C4F-47BB-B88B-D59D6E50A611, EE3D9A9E-1B13-4189-9AA2-01A27C917CF8, 2F0F4AE0-2251-45D2-8428-44061A6D84EB
10E06207-39F6-4DE1-B172-F8F42274C3FA, 0D14106C-06B7-4218-A396-574C5D48157B
6F957995-8717-4BC7-8D75-0BD7D195A6C5

db<>小提琴.

© www.soinside.com 2019 - 2024. All rights reserved.