【问题标题】:SQL - Split string with multiple delimiters into multiple rows and columnsSQL - 将具有多个分隔符的字符串拆分为多行和多列
【发布时间】:2018-09-22 11:29:42
【问题描述】:

我正在尝试使用以下格式在 SQL 中拆分字符串: 'John, Mark, Peter|23, 32, 45'.

我们的想法是在第一列中包含所有名称,在第二列中包含年龄。

查询应该是“动态的”,字符串可以有多个记录,具体取决于用户条目。

有谁知道如何做到这一点,如果可能的话没有 SQL 函数?我尝试过交叉应用方法,但无法成功。

有什么想法吗?

【问题讨论】:

  • 必须先拆分每个实体,然后每个值都带有行号以匹配它们。有无数的字符串拆分函数可供搜索。如果在 SQL Server 2016+ 上,您可以使用 String_Split() 来分隔实体(但没有行号)。
  • 不要在不解释原因的情况下将sqlite3 添加到标签中(人们在阅读您的问题时不太可能不会阅读我的答案中的 cmets)。 sqlite3sql-server 本身就有冲突。详细说明您的要求。

标签: sql sql-server sqlite


【解决方案1】:

此解决方案使用 Jeff Moden 的 DelimitedSplit8k。为什么?因为他的解决方案提供了项目的序数位置。 Ordinal Position 是许多其他函数(包括 Microsoft 自己的 STRING_SPLIT)不提供的东西。这对于让它正常工作至关重要。

一旦你有了它,解决方案就变得相当简单:

DECLARE @NameAges varchar(8000) = 'John, Mark, Peter|23, 32, 45';

WITH Splits AS (
    SELECT S1.ItemNumber AS PipeNumber,
           S2.ItemNumber AS CommaNumber,
           S2.Item
    FROM dbo.DelimitedSplit8K (REPLACE(@NameAges,' ',''), '|') S1 --As you have spaces between the delimiters I've removed these. Be CAREFUL with that
         CROSS APPLY DelimitedSplit8K (S1.item, ',') S2)
SELECT S1.Item AS [Name], 
       S2.Item AS Age
FROM Splits S1
     JOIN Splits S2 ON S1.CommaNumber = S2.CommaNumber
                   AND S2.PipeNumber = 2
WHERE S1.PipeNumber = 1;

【讨论】:

  • 谢谢拉努。我不认为这对我有用。它可能在 SQL Server 中工作,但我担心我将不得不使用其他引擎,如 Access SQL 或 SQLite。这就是我试图避免函数的原因。对此感到抱歉
  • @FlavioJustino 不同的 RDBMS 需要不同的解决方案;他们都是不同的。您在这里提出的问题仅与 SQL Server 有关;如果您有其他需要解决方案的 RDBMS,您应该 edit 您的问题以实际反映您的要求并标记相关的 RDBMS。你不会得到“一刀切”的解决方案,因为那是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多