选择空行后的每一行

时间:2017-08-08 20:33:47

标签: sql sql-server

STRING_SPLIT用于列中的数据后,我有一堆空行和其他行,我不需要。我需要的所有行都直接在空白行下。

是否有一些查询可以选择空白行之后的所有行并删除其余行?

这是我到目前为止的查询:

select value
from catalog
     cross apply string_split(path, '/')

My results are in this link,但我想要的结果是(对于此屏幕截图):

'HQF', 'Insurance', 'Insurance', 'Insurance', 'Insurance'...

2 个答案:

答案 0 :(得分:1)

我有点担心订单,因为订单无法保证... row_number会顺序编号吗?

但这是一个镜头:

WITH CTE AS (SELECT value, row_number() over (order by (Select NULL)) RN
             FROM  catalog
             CROSS APPLY string_split(path, '/'))

SELECT B.*
FROM CTE A
INNER JOIN CTE  B
  on A.RN+1 = B.RN
WHERE (A.value is null or A.value = '')
  and B.value is not null 
  and b.value <> ''

基本上有一组数据,所有空间都有行号和一组数据没有空格..并且将所有行连接到下一行只返回第一个空格和第二个数据的空间。

答案 1 :(得分:1)

DECLARE @Catalog AS TABLE (Id INT IDENTITY(1,1), StringToSplit VARCHAR(100))
INSERT INTO @Catalog (StringToSplit) VALUES ('A//B/C/D'),('1//2//3'),('/1/2')

CREATE TABLE #StringSplitResult (
    OrdinalID INT IDENTITY(1,1)
    ,Id INT
    ,String VARCHAR(100)
)


INSERT INTO #StringSplitResult(Id,String)
SELECT Id, ss.value
FROM
    @Catalog c
    CROSS APPLY string_spilt(c.StringToSplit,'/') ss

;WITH cte AS (
    SELECT
       *
       ,RowBeforeString = LAG(String) OVER (PARTITION BY Id ORDER BY OrdinalId)
    FROM
       #StringSplitResult
)

SELECT *
fROM
    cte
WHERE
    RowBeforeString = ''

在使用string_spilt之后,我对XQbert的关注程度与行的顺序相同。我决定使用临时表来使用ID来对抗它。以下是跨多个字符串使用LAG()的示例,其中字符串中可能包含多个空白行/行。