如何拆分 2 个字符串并插入到 2 列

Posted

技术标签:

【中文标题】如何拆分 2 个字符串并插入到 2 列【英文标题】:How to Split 2 Strings and insert in to 2 columns 【发布时间】:2020-10-24 02:47:01 【问题描述】:

我有两个字符串

Declare @WhenDetails NVarchar(Max) ='07:00:0:0;1:00:1:0;6:00:1:0;10:00:1:0;'
Declare @Dosage NVarchar(Max) ='1.00;2.00;1.00;1.00'

我需要拆分这两个字符串并插入到一个表中

07:00:0:0=>1.001:00:1:0=>2.00 的示例

Declare  @TempDosageWhenDetails Table (RowID INT IDENTITY(1,1), PatientMedicationID INT, Dosage NVARCHAR(Max),WhenDetails NVARCHAR(Max))
insert @TempDosageWhenDetails(Dosage)
select x.items
from dbo.Split('07:00:0:0;1:00:1:0;6:00:1:0;10:00:1:0;', ';') x

我已经拿了一张桌子,拆分并插入了我的详细信息

如示例所示如何填写剂量栏?

请注意,我可能有 n 条记录要拆分,我只是举了一个例子。

【问题讨论】:

【参考方案1】:

也许有一点 JSON(假设 2016+)

示例

Declare @WhenDetails NVarchar(Max) ='07:00:0:0;1:00:1:0;6:00:1:0;10:00:1:0;'
Declare @Dosage NVarchar(Max) ='1.00;2.00;1.00;1.00'

Select RowID = A.[Key]+1
      ,PatientID = null
      ,Dosage = B.[Value]
      ,WhenDetails = A.[Value]
 From (
        Select *
         From  OpenJSON( '["'+replace(@WhenDetails,';','","')+'"]' )
      ) A
 Join (
         Select *
         From  OpenJSON( '["'+replace(@Dosage,';','","')+'"]' )
      ) B
   on A.[Key]=B.[Key]

退货

RowID   PatientID   Dosage  WhenDetails
1       NULL        1.00    07:00:0:0
2       NULL        2.00    1:00:1:0
3       NULL        1.00    6:00:1:0
4       NULL        1.00    10:00:1:0

如果它有助于可视化:

我们把字符串转换成JSON数组,然后根据KEY加入结果是小事

如果你想

Select * From OpenJSON( '["'+replace(@WhenDetails,';','","')+'"]' )

结果是

key value       type
0   07:00:0:0   1
1   1:00:1:0    1
2   6:00:1:0    1
3   10:00:1:0   1

编辑 - XML 方法

Select RowID = A.RetSeq
      ,PatientID = null
      ,Dosage = B.RetVal
      ,WhenDetails = A.RetVal
 From (
        Select RetSeq = row_number() over (order by 1/0)
              ,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
        From  (Select x = Cast('<x>' + replace((Select replace(@WhenDetails,';','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) A
 Join (
        Select RetSeq = row_number() over (order by 1/0)
              ,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
        From  (Select x = Cast('<x>' + replace((Select replace(@Dosage,';','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
        Cross Apply x.nodes('x') AS B(i)
      ) B
   on A.RetSeq=B.RetSeq

【讨论】:

很抱歉,我们仍在使用 15.0。有没有其他方法可以实现它。 @约翰

以上是关于如何拆分 2 个字符串并插入到 2 列的主要内容,如果未能解决你的问题,请参考以下文章

拆分'$'分隔的字符串并插入到表中

拆分分隔符分隔的字符串并插入到oracle 11中的表中

根据两个不同的条件拆分一列字符串(具有不同的模式)

将整数拆分并存储为两个字节

如何逐行拆分scala中的文本

哇 |拆分列并使用子字符串映射