【问题标题】:Split SQL string with specific string instead of separator?用特定字符串而不是分隔符拆分 SQL 字符串?
【发布时间】:2020-01-12 17:20:32
【问题描述】:

我的桌子看起来像:

|ID  | String
|546 | 1,2,1,5,7,8
|486 | 2,4,8,1,5,1
|465 | 18,11,20,1,4,18,11
|484 | 11,10,11,12,50,11

我想把字符串拆分成这样:

|ID  | String
|546 | 1,2
|546 | 1,5
|486 | 1,5,1
|486 | 1
|465 | 1,4

我的目标是显示 ID 和所有以 1 开头的字符串,后面紧跟一个数字。

我过滤了所有没有'%1,%' 的行,我不知道如何继续。

【问题讨论】:

  • 您能否也发布您尝试过的内容,以便我们可以从那里进行统计。
  • 您的数据模型已损坏。规范化数据,问题就消失了。
  • 你确定486 | 1,5,1

标签: sql sql-server string split


【解决方案1】:

如果您使用 SQL Server 2016+,您可以尝试使用基于 JSON 的方法。您需要将数据转换为有效的 JSON 数组,并使用 OPENJSON() 解析 JSON 数组。请注意,STRING_SPLIT() 不是此处的选项,因为如文档中所述,输出行可能是任何顺序,并且不能保证该顺序与输入字符串中子字符串的顺序相匹配.

表:

CREATE TABLE Data (
   ID int,
   [String] varchar(100)
)
INSERT INTO Data
   (ID, [String])
VALUES   
   (546, '1,2,1,5,7,8'),
   (486, '2,4,8,1,5,1'),
   (465, '18,11,20,1,4,18,11'),
   (484, '11,10,11,12,50,11')

声明:

SELECT
   ID,
   CONCAT(FirstValue, ',', SecondValue) AS [String]
FROM (   
   SELECT 
      d.ID, 
      j.[value] As FirstValue, 
      LEAD(j.[value]) OVER (PARTITION BY d.ID ORDER BY CONVERT(int, j.[key])) AS SecondValue
   FROM Data d
   CROSS APPLY OPENJSON(CONCAT('[', d.[String], ']')) j
) t
WHERE t.FirstValue = '1'

结果:

----------
ID  String
----------
465 1,4
486 1,5
486 1,
546 1,2
546 1,5

【讨论】:

    【解决方案2】:

    类似:

    SELECT ID, S.value
    FROM   Data
           CROSS APPLY STRING_SPLIT(REPLACE(',' + String, ',1,', '#1,'), '#') AS S
    WHERE  value LIKE '1,%'
    

    ?

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      相关资源
      最近更新 更多