【问题标题】:Make a separate row if a column contains comma-separated value如果列包含逗号分隔值,则创建单独的行
【发布时间】:2014-12-16 05:32:46
【问题描述】:

假设我们有一个简单的选择查询,它返回如下所示的结果

   FirstName          LastName                     PayScale
   -----------        ------------                ---------------
    Craig              L                             150000
    Alice,Lisa         simons                        100000

所以如果我们有逗号分隔的名字,那么我想要这样的结果

   FirstName          LastName                     PayScale
   -----------        ------------                ---------------
    Craig              L                             150000
    Alice              simons                        100000
    Lisa               simons                        100000

【问题讨论】:

  • 只是想从这样的场景中学习,我对 sql 了解不多,所以我什至不知道该怎么做,
  • 您至少尝试过搜索吗?
  • 是的,我知道,搜索后我只知道它可以用 pivot 完成,如果我没记错的话。但可悲的是我什至不知道枢轴
  • 只是想学sql
  • 规范化非规范化数据库通常非常复杂。部分原因是因为每个数据库都是不同的,部分原因是因为 SQL 不是为操作非规范化数据而设计的。例如,SQL 中没有Split() 函数。那是因为在关系代数的范围内想要这样做实际上是没有意义的。为此,您通常会查询数据库并使用另一种编程语言构建新表。因此,这通常是您可以做的最复杂的事情之一,因为它正在纠正设计错误。

标签: sql sql-server sql-server-2008 multiple-columns


【解决方案1】:

您可以将查询编写为:

DECLARE @employee TABLE (FirstName  VARCHAR(100),
                         LastName   VARCHAR(100),
                         PayScale INT)

INSERT INTO @employee VALUES 
('Craig','L',150000) , 
('Alice,Lisa','simons',100000)



SELECT Split.a.value('.', 'VARCHAR(100)') AS FirstName  , LastName  ,PayScale
       FROM  (SELECT  CAST ('<M>' + REPLACE(FirstName, ',', '</M><M>') + '</M>' 
                             AS XML) AS FirstName ,  LastName    ,PayScale
               FROM  @employee) 
       AS A 
CROSS APPLY FirstName.nodes ('/M') AS Split(a)

【讨论】:

猜你喜欢
  • 2018-01-25
  • 2011-08-02
  • 2017-02-05
  • 2014-03-26
  • 2010-10-23
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多