【问题标题】:split a string by commas (,) SQL SERVER用逗号 (,) 分割字符串 SQL SERVER
【发布时间】:2015-02-04 13:53:58
【问题描述】:

我想用逗号 (,) 或竖线 (|) 将字符串拆分为 SQL SERVER 中的每个字符。例如“苹果”。预期结果:'A|P|P|L|E'。最好不要创建函数。

【问题讨论】:

  • 使用 sql 检索数据并将其存储到数据库中。使用真正的编程语言来操作字符串。
  • 如果你想使用这个主题中已经有@vzczc创建的函数:stackoverflow.com/questions/2647/…
  • 不是有一个sqlServer函数:RegexReplace吗?我对 sqlServer 不是很熟悉,但是,在 Oracle 中: select regexp_replace('APPLE','(.)','\1|') r from dual 工作正常。应该只是使用sqlServer的功能吗?如果是这样,那应该比函数执行得更好,不是吗?
  • @MikeNakis 有时没有“真正的语言”前端来做这些事情。
  • @Jeremy 是的,我知道。再说一次,你总是可以扔掉你的整个系统,从头开始重建它,给它添加一个真正的语言,或者如果这不是一个选择,辞掉你的工作,去一个不会让你浪费时间解决问题的地方工作蹩脚的问题。我的回答是为了鼓励他停下来,重新考虑他的生活。

标签: sql-server split


【解决方案1】:

你可以用 CTE 做到这一点:

DECLARE @s NVARCHAR(MAX) = 'APPLE'
DECLARE @result NVARCHAR(MAX)

;WITH cte(N, S) AS 
(
    SELECT 1 AS N, SUBSTRING(@s, 1, 1)
    UNION ALL
    SELECT N + 1, SUBSTRING(@s, N + 1, 1)
    FROM cte
    WHERE N < LEN(@s)
) 
SELECT @result = COALESCE(@result + '|', '') + S FROM cte
SELECT @result

输出:

A|P|P|L|E

甚至更短的版本:

DECLARE @s NVARCHAR(MAX) = 'APPLE'

;WITH cte(N, S, D) AS 
(
    SELECT 1 AS N, SUBSTRING(@s, 1, 1), D = SUBSTRING(@s, 1, 1)
    UNION ALL
    SELECT N + 1, SUBSTRING(@s, N + 1, 1), D = D + '|' + SUBSTRING(@s, N + 1, 1)
    FROM cte
    WHERE N < LEN(@s)
) 
SELECT TOP 1 D FROM cte
ORDER BY N DESC

【讨论】:

    【解决方案2】:

    您可以使用“Tally Table String Splitter”之类的概念来实现您想要的。

    http://www.sqlservercentral.com/articles/Tally+Table/72993/

    【讨论】:

    • 免费的电子邮件注册值得深入了解 IMO。
    • 仍然是指向可能解决方案的链接是评论,而不是答案。请注意,如果有人尝试使用链接,则该链接可能在 2 年内失效
    • 我想知道SQL SERVER是否有任何本机函数可以用逗号或管道分隔字符串的每个字符。示例:字符串“ABCDE”的值。我需要返回'A,B,C,D,E'的东西。我不想创建一个新函数,需要一些原生的SQL SERVER。在 oracle 中,我可以处理原生函数 (regexp_replace ('ABCDE', '\1 |' '().')
    • @EdineiRaduvanski 不,没有。
    【解决方案3】:
    DECLARE @txt varchar(50) ='APPLE'
    
    ;WITH cte(x) as
    (
      SELECT top (len(@txt)) ';' 
        + substring(@txt, row_number() over (order by (select 1)), 1)
      FROM master..spt_values x1
      cross join
      master..spt_values x2
      FOR XML PATH('')
    )
    SELECT stuff(x, 1, 1, '')
    FROM CTE
    

    结果

    A;P;P;L;E
    

    【讨论】:

    • 我想知道SQL SERVER是否有任何本机函数可以用逗号或管道分隔字符串的每个字符。示例:字符串“ABCDE”的值。我需要返回'A,B,C,D,E'的东西。我不想创建一个新函数,需要一些原生的SQL SERVER。在 oracle 中,我可以处理本机函数 (regexp_replace ('ABCDE', '\ 1 |' '().')
    • @EdineiRaduvanski 不,没有本机 sql-server 函数。
    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多