Sql server 提取特殊字符SQL之间的所有值

Sql server 提取特殊字符SQL之间的所有值,sql-server,sql-server-2019,Sql Server,Sql Server 2019,我在SQL Server表中有以下值: 但我需要构建一个输出如下所示的查询: 我知道我可能应该使用substring和charindex的组合,但我不知道怎么做 你能告诉我这个查询应该是什么样的吗 谢谢大家! 试试下面的方法,可能有用 SELECT offerId, cTypes FROM yourTable AS mt CROSS APPLY EXPLODE(mt.contractTypes) AS dp(cTypes); 尝试以下方法,可能会奏效 SELE

我在SQL Server表中有以下值:

但我需要构建一个输出如下所示的查询:

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

你能告诉我这个查询应该是什么样的吗


谢谢大家!

试试下面的方法,可能有用

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

尝试以下方法,可能会奏效

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

contractTypes
列中的每一行中的数据都是有效的JSON数组,因此您可以使用显式模式(结果是一个包含
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
表:

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
offerId contractId  contractType
1       1           Hlavni pracovni pomer
2       1           ÖCVS
2       2           Staz
2       3           Prahovne
作为一个附加选项,如果要返回合同类型在
contractTypes
数组中的位置,可以使用带有默认模式的
OPENJSON()(结果是一个包含列
类型
的表格,
列中的值是数组中元素的基于0的索引):

结果:

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

contractTypes
列中的每一行中的数据都是有效的JSON数组,因此您可以使用显式模式(结果是一个包含
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
表:

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
offerId contractId  contractType
1       1           Hlavni pracovni pomer
2       1           ÖCVS
2       2           Staz
2       3           Prahovne
作为一个附加选项,如果要返回合同类型在
contractTypes
数组中的位置,可以使用带有默认模式的
OPENJSON()(结果是一个包含列
类型
的表格,
列中的值是数组中元素的基于0的索引):

结果:

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

您可以使用
string\u split
函数:

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

您可以使用
string\u split
函数:

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

您使用的是哪个SQL引擎?如果我理解正确,您希望分解数组,对吗?我使用的是Microsoft SQL server 2019,是的,我需要获取每个值,并将其类似于输出,这意味着例如,offerId=1将是三行,其中每个值都来自您使用的SQL引擎的contractType数组?如果我取消derstand是否正确?是否要分解数组?我使用的是Microsoft SQL server 2019,是的,我需要获取每个值,并将其像输出中一样。这意味着,例如,offerId=1将是三行,其中每个值都来自contractType array。幸运的是,不起作用。我有以下错误:'explode'不是可识别的函数ion名称。不幸的是不起作用,我有以下错误:'EXPLODE'不是可识别的函数名。