我想查询一个总是在找到字符'-'
时导致新列的查询示例:
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
答案 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