【问题标题】:Extraction all values between special characters SQL提取特殊字符之间的所有值 SQL
【发布时间】:2020-04-12 05:49:58
【问题描述】:

我在 SQL Server 表中有以下值:

但我需要构建查询,其输出如下所示:

我知道我可能应该使用 substring 和 charindex 的组合,但我不知道该怎么做。

您能帮我查询一下应该是什么样子吗?

谢谢!

【问题讨论】:

  • 您使用的是哪个 SQL 引擎?如果我理解正确,你想爆炸数组吗?
  • 我正在使用 Microsoft SQL Server 2019,是的,我需要获取每个值并在输出中使用它,这意味着例如,offerId = 1 将是三行,每个值都来自合约类型数组

标签: sql-server sql-server-2019


【解决方案1】:

试试下面的方法,可能会奏效。

SELECT 
  offerId, 
  cTypes   
FROM yourTable AS mt  
CROSS APPLY  
EXPLODE(mt.contractTypes) AS dp(cTypes);  

【讨论】:

  • 不幸的是不起作用,我有以下错误:'EXPLODE' 不是可识别的函数名称。
【解决方案2】:

你可以使用string_split函数:

select t.offerid, trim(translate(tt.value, '[]"', '   ')) as contractTypes
from table t cross apply
     string_split(t.contractTypes, ',') tt(value);

【讨论】:

    【解决方案3】:

    contractTypes 列中每一行的数据是一个有效的 JSON 数组,因此您可以使用带有显式架构的OPENJSON()(结果是一个包含在WITH 子句中定义的列的表)来解析这个数组并得到预期的结果:

    表:

    CREATE TABLE Data (
       offerId int,
       contractTypes varchar(1000)
    )
    INSERT INTO Data
       (offerId, contractTypes)
    VALUES
       (1, '[   "Hlavni pracovni pomer"      ]'),
       (2, '[   "ÖCVS", "Staz", "Prahovne"   ]')
    

    表:

    SELECT d.offerId, j.contractTypes
    FROM Data d
    OUTER APPLY OPENJSON(d.contractTypes) WITH (contractTypes varchar(100) '$') j
    

    结果:

    offerId contractTypes
    1       Hlavni pracovni pomer
    2       ÖCVS
    2       Staz
    2       Prahovne
    

    作为附加选项,如果您想在contractTypes 数组中返回合约类型的位置,您可以使用带有默认架构的OPENJSON()(结果是一个包含列keyvaluetypekey 列中的值是数组中元素的从 0 开始的索引):

    SELECT 
       d.offerId, 
       CONVERT(int, j.[key]) + 1 AS contractId, 
       j.[value] AS contractType
    FROM Data d
    OUTER APPLY OPENJSON(d.contractTypes) j   
    ORDER BY CONVERT(int, j.[key])
    

    结果:

    offerId contractId  contractType
    1       1           Hlavni pracovni pomer
    2       1           ÖCVS
    2       2           Staz
    2       3           Prahovne
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 2015-06-23
      • 2019-01-28
      相关资源
      最近更新 更多