2017-08-08 3 views
0

Nach der Verwendung STRING_SPLIT zu den Daten in einer Spalte, habe ich eine Reihe von Zeilen, die leer sind und andere Zeilen, die ich nicht brauche. Alle Zeilen, die ich brauche, sind direkt unter einer leeren Zeile.Wählen Sie jede Zeile nach einer leeren Zeile

Gibt es eine Abfrage, die alle Zeilen nach einer leeren Zeile auswählen und den Rest der Zeilen löschen kann?

Dies ist die Abfrage, die ich bisher:

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

My results are in this link, aber ich möchte die Ergebnisse (für diesen Screenshot) sein:

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

Möchten Sie Ihren Code, Beispieldaten, das Ergebnis und das erwartete Ergebnis teilen? –

+0

Hinzufügen einer Where-Klausel zum Auswählen? 'Wo Spalte nicht Null oder Spalte ist <> '''? – xQbert

+0

@FerdinandGaspar Ich habe alles hinzugefügt. Danke für den Hinweis. – user3721227

Antwort

1

Ich bin ein wenig besorgt über Die Reihenfolge seit Bestellung ist nicht garantiert ... wird row_number fortlaufend korrekt nummeriert?

aber hier ist ein Schuss:

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

Im Grunde eine Reihe von Daten haben alle Räume w/Zeilennummern und eine Reihe von Daten w/ohne Leerzeichen .. und verbinden alle Zeilen in die nächste Zeile nur diejenigen Rückkehr wo ein Leerzeichen in erster und Daten in 2.

+0

Ich würde diesen Ansatz auch getan, aber gefragt, ob es einen Identitätsschlüssel statt – KeithL

+0

@xQbert Ich hatte die gleiche Sorge/Neugier, wie würden Sie row_order Position beibehalten, wenn die Zeichenfolge aufgeteilt. Ich frage mich auch, ob ROW_NUMBER hier arbeiten würde oder nicht, lass mich wissen, was du herausfindest, da ich neugierig bin. – Matt

+0

Hasse, um wieder dieser Kerl zu sein, aber jetzt gibt es diese Nachricht: "Windowed Funktionen und NEXT VALUE FOR Funktionen unterstützen keine Konstanten als ORDER BY Klausel Ausdrücke" – 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 = '' 

hatte ich die gleiche Sorge wie XQbert bis Reihenfolge der Zeilen nach string_spilt verwenden. Ich entschied mich, eine temporäre Tabelle zu verwenden, um das zu bekämpfen, indem ich eine ID verwendete. Hier ist ein Beispiel, das LAG() über mehrere Zeichenfolgen verwendet und in dem eine Zeichenfolge mehrere leere Zeilen/Zeilen enthalten kann.

+0

das ist *** einige *** der gleichen Sorge: P obwohl, wie ist der Einsatz garantiert zu sein in der richtigen Reihenfolge? das gleiche Problem; Ich würde vor allem denken, wenn das irgendwie zu mehreren Threads ging. – xQbert

+0

@xQbert Einverstanden, ich dachte nur, es wäre mehr garantiert, direkt in den Speicher in der Art und Weise ausgegeben werden, wie es aus der Funktion kommt, weil ROW_NUMBER() hätte einen Effekt der Neuordnung der Ergebnisse durch die ORDER BY-Klausel .. Scheint mir MS hätte eine zweite Ordnungsnummer mit der string_spilt-Funktion hinzugefügt werden, aber ich sehe keine in der Dokumentation. https://docs.microsoft .com/de-de/sql/t-sql/funktionen/string-split-transact-sql – Matt

+0

Sie wissen, ob wir eine rekursive Cte ​​verwendet haben, um die Aufteilung stattdessen zu behandeln und unsere eigene Nummerierungslogik angewendet habe, glaube ich nicht, dass es sein würde ein Problem dann, traurig wir müssen die eingebettete Funktion vermeiden, da wir die Reihenfolge nicht kennen.Der 2. April 2017 Kommentar hat die gleiche Frage, die wir tun. (SteveAQ) – xQbert

Verwandte Themen