2017-08-08 116 views
0

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

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

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

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

My results are in this link,但我想要的结果是(这个截图):

'HQF', 'Insurance', 'Insurance', 'Insurance', 'Insurance'... 
+1

想要分享您的代码,样本数据,结果和预期结果吗? –

+0

将where子句添加到select? '列的位置不为空或列<>'''? – xQbert

+0

@FerdinandGaspar我已经添加了所有。感谢您的建议。 – user3721227

回答

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 <> '' 

基本上有一组数据的所有空间瓦特/行号和一组数据瓦特/没有空间..并加入所有行的下一行只返回那些首先存在空间,第二个存在数据。

+0

我也会这样做,但是询问是否存在身份密钥而不是rownumber – KeithL

+0

@xQbert对于在分割字符串时如何保持row_order位置,我有同样的疑虑/好奇心。我也怀疑ROW_NUMBER是否会在这里工作,或者因为我好奇而不让我知道你发现了什么。 – Matt

+0

讨厌再次成为那个家伙,但现在有这样的信息: “窗口函数和NEXT VALUE FOR函数不支持常量作为ORDER BY子句表达式” – user3721227

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()的示例,其中字符串可能包含多个空白行/行。

+0

这是***一些***同样担心:P虽然如何保证插入按照正确的顺序?相同的问题;我想特别是如果以某种方式,这涉及到多个线程 – xQbert

+0

@xQbert同意,我只是认为它会更保证直接转储到存储器的方式,因为它的功能,因为ROW_NUMBER ()会有ORDER BY子句对结果进行重新排序的效果,在我看来,MS应该在string_spilt函数中添加第二个序号,但在文档中没有看到其中的一个。https://docs.microsoft .com/en-us/sql/t-sql/functions/string-split-transact-sql – Matt

+0

你知道我们是否使用递归cte来处理split,并应用我们自己的编号逻辑,我不认为它会是这是一个问题,可悲的是我们必须避免嵌入式功能,因为我们不知道订单。2017年4月2日的评论与我们所做的相同。 (SteveAQ) – xQbert