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.