我有一个具有以下格式的数组:
""
,
;
{}
例如以下字符串...
{"73","2022-09-02 11:42:37.00";"118","2022-08-31 10:41:59.00";"123","2022-09-01 15:26:06.00"}
...将表示一个两列表,第一列的值为 73、118 和 123,2022-09-02 11:42:37.00、2022-08-31 10:41:59.00 和 2022- 09-01 15:26:06.00 在第二栏。
我想将此数组转换为 SQL 中的表。
查看其他几个类似的问题后,我找到了答案,引导我找到了这个解决方案......
DECLARE @array varchar(max)
SET @array = '{"73","2022-09-02 11:42:37.00";"118","2022-08-31 10:41:59.00";"123","2022-09-01 15:26:06.00"}'
SET @array = REPLACE(REPLACE(@array, '{', ''), '}', '')
SELECT Min(CASE b.ordinal WHEN '1' THEN b.value END) 'ID',
Min(CASE b.ordinal WHEN '2' THEN b.value END) 'Date'
FROM STRING_SPLIT(@array, ';', 1) a
CROSS APPLY STRING_SPLIT(a.value, ',', 1) b
GROUP BY a.ordinal
还有这个选项...
DECLARE @array varchar(max)
SET @array = '{"73","2022-09-02 11:42:37.00";"118","2022-08-31 10:41:59.00";"123","2022-09-01 15:26:06.00"}'
SET @array = REPLACE(REPLACE(@array, '{', ''), '}', '')
SELECT PARSENAME(REPLACE(a.value, ',', '.'), 2) 'ID',
PARSENAME(REPLACE(a.value, ',', '.'), 1) 'Date'
FROM STRING_SPLIT(@array, ';', 1) a
但是,我对 SQL Server 相当陌生,所以我有一些问题:
这是一种使用
string_split()
和一些 JSON 的方法
注意:如果您想要 Pos3(或更多)...只需遵循模式即可。如果没有值,将返回NULL。
示例
Declare @S varchar(max) = '{"73","2022-09-02 11:42:37.00";"118","2022-08-31 10:41:59.00";"123","2022-09-01 15:26:06.00"}'
Select ID = JSON_VALUE(JS,'$[0]')
,Date = JSON_VALUE(JS,'$[1]')
From string_split(replace(replace(@S,'{',''),'}',''),';') A
Cross Apply (values ( ('['+A.Value+']') )) B(JS)
结果
ID Date
73 2022-09-02 11:42:37.00
118 2022-08-31 10:41:59.00
123 2022-09-01 15:26:06.00
将字符串拆分为表的另一个选项是将字符串转换为数组的数组,然后使用 OPENJSON。
/* Demo for linking another table */
DECLARE @tmpTable table(id int, someColumn nvarchar(50))
insert into @tmpTable
values (73, '73 Data')
/* Handle String */
DECLARE @array varchar(max) = '{"73","2022-09-02 11:42:37.00", "more data";
"118","2022-08-31 10:41:59.00";
"123","2022-09-01 15:26:06.00"}'
SET @array = REPLACE(REPLACE(REPLACE(@array
, '{', '[[')
, ';', '],[')
, '}', ']]')
/* Query */
SELECT
d.ID,
d."Date",
d.col3,
t.someColumn
FROM OPENJSON(@array)
WITH (
ID int '$[0]',
"Date" datetime '$[1]',
col3 nvarchar(50) '$[2]'
) d
LEFT JOIN @tmpTable t on t.id = d.ID
使用“WITH”指定列名称、类型和值所在的位置。
我添加了一个表来演示加入。还在第一行中添加了第三列以显示如何处理更多列。
结果
身份证 | 日期 | col3 | 一些专栏 |
---|---|---|---|
73 | 2022-09-02 11:42:37.000 | 更多数据 | 73 条数据 |
118 | 2022-08-31 10:41:59.000 | 空 | 空 |
123 | 2022-09-01 15:26:06.000 | 空 | 空 |