【问题标题】:Sql double split on delimiter分隔符上的Sql双重拆分
【发布时间】:2016-07-22 02:48:02
【问题描述】:

所以我将字符串值发送到数据库

@string = 'Value1|Value2|Value3|Value4, OtherVal1|OtherVal2|OtherVal3|OtherVal4'

还有一些其他的ID

@id = '1'

我想先在','上拆分它,然后在|上拆分它并插入到表中

例子

TABLE
ID     | COLUMN1    |COLUMN2      |COLUMN3      |COLUMN4        |COLUMN5
ai     |  @id       | value1      |value2       |value3         |value4
ai     |  @id2      |otherVal1    |otherVal2    |otherVal3      |otherVal4

这是我到目前为止所做的代码,但我的另一个 while 函数按值返回值,

DECLARE @string nvarchar(max)
DECLARE @IDSet nvarchar(max)

DECLARE @columnsValue nvarchar(max)
DECLARE @columnsPos int

DECLARE @pos int
DECLARE @nextPost int

DECLARE @delimiter nchar(1)
DECLARE @delimiter2 nchar(1)



SET @delimiter2 = '|'
SET @delimiter = ','

SET @string = 'ColumnName|autocompleteId|autocompleteValue|AndOrStatus,ColumnName1|autocompleteId1|autocompleteValue1|AndOrStatus1'  + @delimiter

SET @pos = charindex(@delimiter, @string)


WHILE(@pos <> 0)
BEGIN
    SET @IDSet = substring(@string,1,@pos -1) + @delimiter2
    --SELECT @IDSet

        SET @columnsPos = charindex(@delimiter2,@IDSet)

        WHILE(@columnsPos <> 0)
        BEGIN
            SET @columnsValue = substring(@IDSet ,1,@columnsPos - 1)
            SELECT @columnsValue
            SET @IDSet = substring(@IDSet,@columnsPos +1, LEN(@IDSet))
            SET @columnsPos = charindex(@delimiter2,@IDSet)
        END

    SET @string = substring(@string,@pos + 1,LEN(@string))
    SET @pos = charindex(@delimiter,@string)
    END

当前代码经过两个 while 语句并按其分隔符拆分代码,

知道如何从中插入表格。

【问题讨论】:

  • 是否总是4个值
  • @Prdp 会的
  • @Prdp 我已经开始做这样的事情,而不是第二个 while 语句 SELECT SUBSTRING(@IDSet , 1 , CASE CHARINDEX('|',@IDSet) WHEN 0 THEN LEN(@IDSet) ELSE charindex ('|',@IDSet)-1 END) AS test1, SUBSTRING(@IDSet , CASE CHARINDEX('|',@IDSet) WHEN 0 THEN len(@IDSet)+1 ELSE CHARINDEX('|',@IDSet) +1 END, 1000) AS test2 但是我如何选择直到下一个'|'而不是接下来的 1000 个字符

标签: sql sql-server split insert delimiter


【解决方案1】:

这是使用PARSENAME的一个技巧

首先使用任何拆分字符串方法拆分值。我用XML方法拆分字符串

然后使用PARSENAME 函数将值拆分到列的

DECLARE @string VARCHAR(500)= 
        'Value1|Value2|Value3|Value4, OtherVal1|OtherVal2|OtherVal3|OtherVal4'; 

WITH cte 
     AS (SELECT Replace(Rtrim(Ltrim(split.a.value('.', 'VARCHAR(100)'))), '|','.') AS split_data 
         FROM   (SELECT Cast ('<M>' + Replace(@string, ',', '</M><M>') 
                              + '</M>' AS XML) AS Data) AS A 
                CROSS apply data.nodes ('/M') AS Split(a)) 
SELECT COLUMN2= Parsename(split_data, 4), 
       COLUMN3=Parsename(split_data, 3), 
       COLUMN4= Parsename(split_data, 2), 
       COLUMN5=Parsename(split_data, 1) 
FROM   cte 

SQL Server 2016 中,您可以使用 STRING_SPLIT 函数拆分数据

;WITH cte 
     AS (SELECT split_data = Replace(Rtrim(Ltrim(value)), '|', '.') 
         FROM   String_split(@string, ',')) 
SELECT COLUMN2= Parsename(split_data, 4), 
       COLUMN3=Parsename(split_data, 3), 
       COLUMN4= Parsename(split_data, 2), 
       COLUMN5=Parsename(split_data, 1) 
FROM   cte 

结果:

╔═══════════╦═══════════╦═══════════╦═══════════╗
║  COLUMN2  ║  COLUMN3  ║  COLUMN4  ║  COLUMN5  ║
╠═══════════╬═══════════╬═══════════╬═══════════╣
║ Value1    ║ Value2    ║ Value3    ║ Value4    ║
║ OtherVal1 ║ OtherVal2 ║ OtherVal3 ║ OtherVal4 ║
╚═══════════╩═══════════╩═══════════╩═══════════╝

【讨论】:

  • 是否还有精确的十进制列的解决方案?
猜你喜欢
  • 2018-12-08
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2017-07-04
  • 2021-06-14
  • 2021-06-23
相关资源
最近更新 更多