Also habe ich auf einem gerade arbeite Code Golf Puzzle und Notwendigkeit , eine INT „Nummer“ Spalte hinzufügen n zu einem Ergebnis , während die aktuelle Reihenfolge beibehalten wird .
Angenommen, meine Quelldaten sind:
SELECT value
FROM STRING_SPLIT('one,two,three,four,five', ',')
Dies gibt die Artikel in der ursprünglichen (gewünschten) Reihenfolge zurück:
value
-----
one
two
three
four
five
Wenn ich versuche zu verwenden ROW_NUMBER()
oder RANK()
gezwungen bin, eine anzugeben ORDER BY
, value
ist dies die einzige rechtliche Wahl:
SELECT value, n = ROW_NUMBER() OVER(ORDER BY value)
FROM STRING_SPLIT('one,two,three,four,five',',')
Dies wird jedoch (wie erwartet) value
alphabetisch sortiert, anstatt es in der gewünschten ursprünglichen Reihenfolge zu belassen:
value n
------ ---
five 1
four 2
one 3
three 4
two 5
Das Verknüpfen mit einer Zahlentabelle funktioniert nicht, da WHERE
ich ohne Klausel einen vollständigen äußeren Join erhalte.
Das Beste, was ich mir einfallen lassen konnte, war die Verwendung einer temporären Tabelle mit einem Identitätsfeld:
CREATE TABLE #argg (n INT IDENTITY(1,1), v VARCHAR(99))
INSERT #argg
SELECT value v
FROM STRING_SPLIT('one,two,three,four,five',',')
SELECT *
FROM #argg
DROP TABLE #argg
aber das ist wirklich lang und nervig. Irgendwelche besseren Ideen?
STRING_SPLIT
Rückkehrelemente in einer anderen Reihenfolge als der offensichtlichen, aber vielleicht ist es mit einigen verrückten langen Saiten möglich. Vielen Dank.Eine andere Option ist die Verwendung einer Sequenz:
Ausgabe:
Es ist ärgerlich, dass
STRING_SPLIT
ohne integrierte Nummerierungsoption implementiert wurde. Stimmen Sie für Änderungen unter https://feedback.azure.com/forums/908035-sql-server/suggestions/32902852-string-split-is-not-feature-complete abquelle
STRING_SPLIT
wäre absolut ideal!Fügen Sie einfach eine weitere Alternative aus Ihrer Frage hinzu. Aber ich denke, die Bestellung ist nicht garantiert,
quelle
IDENTITY()
!INTO
Um weiter zu klären, ist das erforderlich, damit das funktioniert, sonst bekommt manThe IDENTITY function can only be used when the SELECT statement has an INTO clause.