我需要用分隔值拆分表中两列的值.

我的源表如下所示:

product_id ean_upc is_approved
2102961 8710103368021;8710103368038;8710103368014 1;0;1
92923683 0195161923722;195161923722;10195161923729 1;1;0
656364 8710103203919;8710103239093;8710103203902 1;1;1
735699 8710103285885;8710103295938;8710103295952 0;0;1

我需要的是一条SELECT语句,它为我返回product_idEAN代码

SELECT 
    product_id, EAN.value
FROM
    IceCatUK.dbo.ice_indexCSV_tmp
CROSS APPLY
    STRING_SPLIT(ean_upc , ';') EAN

问题是,我也需要这is_approved个信息.

我的最后一张桌子需要有Product_id,分离的EAN_upcis_approved的旗帜.

is_approved必须链接到EAN的列

第一行的结果应该如下所示:

product_id ean_upc is_approved
2102961 8710103368021 1
2102961 8710103368038 0
2102961 8710103368014 1

如何将string_split(EAN)中的位置与string_split("is_approved")的位置挂钩?

推荐答案

类似于@lemon的出色答案,但将EAN和Approval都收集到单独的结果集中,并对product_idordinal进行联接,以避免由两个Cross-Apply联接产生的可能较大的中间笛卡尔结果集.根据您的数据大小,这可能会更有性能.

SELECT ice_indexCSV_tmp.product_id, 
  EAN.value as ean_upc,
  dt.is_approved
FROM ice_indexCSV_tmp
   CROSS APPLY STRING_SPLIT(ean_upc, ';', 1) EAN
   INNER JOIN 
       ( 
            SELECT ice.product_id, APPROVED.value as is_approved, APPROVED.ordinal 
            FROM ice_indexCSV_tmp ice 
                CROSS APPLY STRING_SPLIT(is_approved, ';', 1) APPROVED 
      ) dt
     ON EAN.ordinal = dt.ordinal
        AND ice_indexCSV_tmp.product_id = dt.product_id

dbfiddle version

请注意,enable_ordinal参数仅在SQL-SERVER 2022 16.x或Azure数据库中可用.当string_split()最初推出时,它没有包括在内,这是一个可怕的疏忽.

@charleschen的答案中的row_number路由可能是下一个最好的 Select ,但是因为不能保证交叉应用和string_split()产生的值的顺序,所以这有点像是在赌博.话虽如此,我从未见过SQL Server以与输入的字符串不同的顺序输出string_split个结果.

最终,如果我有一个较旧版本的SQL-SERVER,其中enable_ordinal不可用,并且这是生产级代码,我可能会在摄取到SQL SERVER之前,考虑对用于填充该表的源数据进行预处理.你可以在有pandas.Series.explode()个大Pandas 的数据帧中快速处理这一点.

Sql相关问答推荐

使用子查询和连接更新PostgreSQL

如何在VB.NET中使用MS SYS根据开始和结束期间日期进行查询

Group By子句返回太多行

使用Lead获取下一个不同的日期

SQL SELECT MOST NEST TIMESTAMP BEAT ORDER

按分隔符和总和分析字符串

查询每周数据(周一至周日),避免年度日期重叠

如何将不同层次的产品组和规格组合到最深一层?

SQL将三个表中的三列组合为一列

违反了完整性约束-值存在时找不到父键

查找滑动窗口框架中的最大和最小列值

将 jsonb 数组中的对象取消嵌套到单独的行中

对现有记录进行分组

基于变量的条件 WHERE 子句

如何将输出转换为二维格式?

使用日期和间隔作为键加入 Athena 上的表?

雅典娜弄错了操作顺序

来自 SQL Server 的树层次 struct 图的 JSON

snowfalke 会在 Select 运行时锁定表吗?

具有关联统计信息 N+1 的 Rails 6 索引资源?