Czy istnieje funkcja lub operator, lub w inny sposób prosty (r) konstrukcja, aby uzyskać przecięcie dwóch literałów krotek w sql Oracle?Oracle SQL: Przecięcie literałów tptle
Biorąc pod uwagę następujący przykład:
Mając Poniższa tabela
------------------------------
TABLE sometable
------------------------------
id | telephone | mobile | fax
------------------------------
1 | 123 | 456 | 789
otrzymali listę liczb {n N1, N2, N3, ..., n} Znajdź ID tak, że:
telephone = n1 or mobile = n1 or fax = n1
or telephone = n2 or mobile = n2 or fax = n2
or telephone = n3 or mobile = n3 or fax = n3
....
or telephone = n or mobile = n or fax = n
dwóch prawdopodobnych rozwiązania to:
1. Roztwór 1
SELECT id FROM sometable
WHERE
n1 IN (telephone, mobile, fax)
OR n2 IN (telephone, mobile, fax)
OR n3 IN (telephone, mobile, fax)
....
OR n IN (telephone, mobile, fax)
;
2. Roztwór 2
SELECT id FROM sometable
WHERE
telephone IN (n1, n2, n3, ..., n)
OR mobile IN (n1, n2, n3, ..., n)
OR fax IN (n1, n2, n3, ..., n)
;
Jednakże istnieje funkcja/operator wykonać następujące czynności?
SELECT id
FROM sometable
WHERE
intersect_function
(
(telephone, mobile, fax),
(n1, n2, n3, ..., n)
)
= TRUE
;
Alternatywą, prostsza konstrukcja będzie mile widziana, biorąc pod uwagę, że warunek ten jest częścią dłuższego zapytania z bardziej liczne i ewentualnie bardziej skomplikowanych warunkach.
Dzięki.
'wybrać regexp_substr ('123, 456', '\ D +', 1, poziom) n z podwójnym połączyć się regexp_instr ('123, 456', '\ D +', 1 stopień)! = 0' jest bardzo pomocny. po rozbiciu go na stół możliwości są liczne. Jedna z interesujących rzeczy, którą zauważyłem, to koszt zapytania wydaje się stały, podczas gdy rozwiązania 1 i 2 koszty są takie same i mają tendencję do różnic. – fluxy