【问题标题】:Split a string column to single column and sort将字符串列拆分为单列并排序
【发布时间】:2020-07-02 14:59:46
【问题描述】:

我正在编写一个函数来拆分逗号分隔的列,并在单个列中列出值并计算它们。

样本数据

CREATE TABLE stri 
(name varchar(100))
INSERT INTO stri 
VALUES ('a1, a2, a9, a8') 

我会使用它来拆分值,但是我需要将它们放在一个列中。我正在考虑旋转,并将其复杂化,因为我希望结果按升序排序。

SELECT 
     REVERSE(PARSENAME(REPLACE(REVERSE(name), ',', '.'), 1)) AS name1
   , REVERSE(PARSENAME(REPLACE(REVERSE(name), ',', '.'), 2)) AS name2
   , REVERSE(PARSENAME(REPLACE(REVERSE(name), ',', '.'), 3)) AS name3
   ,REVERSE(PARSENAME(REPLACE(REVERSE(name), ',', '.'), 4)) AS name4
FROM dbo.stri;
GO

上面的查询显示

name1 name2 name3 name4
a1    a2    a9    a8

我期望的结果是:

     name
          a1
          a2
          a8
          a9

           4 -- count

感谢任何指南。

【问题讨论】:

  • 逗号分隔的列对于数据库模式设计来说几乎是邪恶的。为自己省去一大堆麻烦,不要这样做。相反,添加一个包含两列的附加表:一列用于原始表中的主键,另一列用于逗号分隔列表中的单个值。然后,这个新表可以为原始表中的每一行包含几行。
  • 谢谢。是的,这就是我想要做的。坚持用分隔值填充新表。
  • 您仍在尝试处理 SQL 中的逗号分隔数据。处理此问题的最佳方法是在客户端语言中分离数据,涉及任何 SQL 之前。

标签: sql sql-server function


【解决方案1】:

如果您使用的是 SQL Server 2016 或更高版本,则可以使用string_split,如下所示:

select trim(value)
from stri A
outer apply string_split(A.[name], ',')
order by 1

您可以在上述查询中使用 CTE 计算记录数。

如果您使用的是 SQL Server 2014,则可以使用XML 方法,如下所示:

SELECT LTRIM(RTRIM(Split.a.value('.', 'NVARCHAR(MAX)'))) Result
FROM
(
    SELECT CAST('<X>'+REPLACE([Name], ',', '</X><X>')+'</X>' AS XML) AS String
    FROM STRI
) AS A
CROSS APPLY String.nodes('/X') AS Split(a)
ORDER BY 1

db小提琴demo

请查看更多详情here

【讨论】:

  • 我用的是 2014。不过还是谢谢。
  • @lije 谢谢!我也更新了 SQL 2014 的答案。
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2019-03-12
  • 2020-01-19
  • 1970-01-01
相关资源
最近更新 更多