存在字符时透视SQL

时间:2018-08-10 14:46:31

标签: sql sql-server sql-server-2008

我想查询一个总是在找到字符'-'

时导致新列的查询

示例:

WITH Test as (
SELECT 'Robert - Plant' as name union all
SELECT 'Mary - Elizabeth -Smith' as name union all
SELECT 'Cristian - Lord Gray, Tyson' as name
)

SELECT Name
FROM Test

应该是:

Name1, Name 2, Name 3, name4
Robert, Plant, Null, Null
Mary, Elizabeth, Smith, Null
Cristian, Lord, Gray, Tyson

1 个答案:

答案 0 :(得分:2)

交叉应用B将创建一个以空格分隔的“ CleanString”。

Cross Apply C将解析干净的字符串

示例

WITH Test as (
SELECT 'Robert - Plant' as name union all
SELECT 'Mary - Elizabeth -Smith' as name union all
SELECT 'Cristian - Lord Gray, Tyson' as name
)


Select Name
      ,C.*
 From  Test A
 Cross Apply (values (ltrim(rtrim(replace(replace(replace(replace(replace(Name,'-',' '),',',' '),' ','†‡'),'‡†',''),'†‡',' ')))) ) B(CleanString)
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                From  (Select Cast('<x>' + replace(CleanString,' ','</x><x>')+'</x>' as xml) as xDim) as A 
             ) C

返回

Name                            Pos1        Pos2        Pos3    Pos4    Pos5
Robert - Plant                  Robert      Plant       NULL    NULL    NULL
Mary - Elizabeth -Smith         Mary        Elizabeth   Smith   NULL    NULL
Cristian - Lord Gray, Tyson     Cristian    Lord        Gray    Tyson   NULL
  

编辑-只需一个下斜线即可看到第二个问题

WITH TEST AS
  (SELECT 'AAAA - BBBBB - CCCC- DDDD' AS Name
   UNION ALL SELECT 'EEEE - GGGGG - FFFF' AS Name
   UNION ALL SELECT 'EEEE - RRRR -' AS Name
   UNION ALL SELECT 'LLLL - WWWW - IIII- TTTT' AS Name
   UNION ALL SELECT 'QQQQ' AS Name
  )
SELECT A.Name
      ,B.*
 FROM TEST A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                From  (Select Cast('<x>' + replace(Name,'-','</x><x>')+'</x>' as xml) as xDim) as B1 
             ) B