【问题标题】:How to concatenate multiple columns into one on Azure Synapse如何在 Azure Synapse 上将多列连接成一列
【发布时间】:2023-02-25 12:39:29
【问题描述】:

我正在尝试在 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 类型。我试图将它们转换为字符串,如下所示,但没有结果。

有人对这个问题有想法吗?

结果样本:

Category ParentGuid EnfantGuid Path 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 NULL NULL NULL NULL NULL

在这一行路径必须包含EnfantGuid_1+EnfantGuid_2但它只有Enfant_Guid1==> 最后一个CASE WHEN条件

【问题讨论】:

  • Serverless SQL pool in Azure Synapse Analytics 是一个 SQL Server 变体,因此 SQL Server 标记在 IMO 中很好。
  • 出于某种原因,在我看来,这是要在运行时执行的“case-when”的“else”部分。您能否出于好奇将 WHEN 子句更改为始终为真?
  • 我不这么认为!因为当我像这样更改列的顺序时 (EnfantGuid_2,EnfantGuid_1) 我找到了第一列所以我确定它执行了这个 CASE

标签: sql sql-server concatenation string-concatenation azure-synapse


【解决方案1】:

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

    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 null
6f957995-8717-4bc7-8d75-0bd7d195a6c5 c2128d35-5b6f-4b60-bb75-f2b4f6a28ad7 null null

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<>fiddle。

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2020-11-03
    • 1970-01-01
    • 2022-06-23
    相关资源
    最近更新 更多