Sep 24

IN-Listen lassen sich bei einer Oracle leider nicht als Bind-Var übergeben. Wirklich nicht ? Doch, geht mit Trick:

SELECT   REGEXP_SUBSTR (:txt,'[^,]+',1,LEVEL) as token
   FROM   dual
   CONNECT BY   LEVEL <= LENGTH (:txt) - LENGTH (REPLACE (:txt, ',', '')) + 1
									

Durch den RegEx und das Connect by Prior macht die ORACLE eine Tabelle aus jedem Element, welches in :txt übergeben wird. Getrennt wird per „,“. Einsetzen lässt sich das ganze dann wie folgt:

SELECT * FROM emp WHERE emp_id IN (SELECT   REGEXP_SUBSTR (:txt,'[^,]+',1,LEVEL) as token
   FROM   dual
   CONNECT BY   LEVEL <= LENGTH (:txt) - LENGTH (REPLACE (:txt, ',', '')) + 1)
									

Nicht schön, aber funktional; Und am performantesten von all‘ den Workarounds, die ich bisher so gesehen habe.

Tagged with:
Feb 17

Gegeben sei folgende Tabelle:

Wert Orderer
A 10
B 20
C 30
D 40
E 50
F 60
G 70
H 80
I 90

Nun mal angenommen folgendes möchten wir irgendwie aus der DB bekommen (Um eine 3 spaltige Tabelle mit tr,td aufzubauen:

Wert Wert Wert
A D G
B E H
C F I

Dann benötigen wir die Daten ja in folgender Reihenfolge:

A,D,G,B,E,H,C,F,I

Nach langem herumprobieren habe ich alle Versuche über Bord geworfen, und bin zu folgendem, suboptimalen (aufgrund der Subselects), Ergebnis gekommen:


SELECT wert
FROM (SELECT wert,
x,
ROW_NUMBER () OVER (PARTITION BY x ORDER BY orderer) AS y
FROM (SELECT wert,
orderer,
NTILE (:3) OVER (ORDER BY orderer) AS x
FROM tabelle))
ORDER BY y, x

Hat jemand einen besseren Vorschlag… Ich meine: Funktionieren tut das ganze (In BIND-Variable 3 wird die Anzahl der Spalten übergeben). Aber Sexy geht irgendwie anders…

Tagged with:
preload preload preload