wankstain
#sql #oracle #naukaprogramowania #programowanie
jak zrobić takiego CASE we WHERE żeby
jeśli idpracownika jest w zbiorze (:A, :B, :C, :D, :E) to dodaj do tego zbioru jeszcze jednego pracownika i zwróć wszystkich?

może mój niedziałający kod pokaże, o co mi chodzi
WHERE EMP
ID IN (
CASE WHEN 'X' IN (:A, :B, :C, :D, :E) THEN (:A, :B, :C, :D, :E, 'Y') ELSE (:A, :B, :C, :D, :E)
)
  • Najlepsze
  • Wszystkie komentarze
Jakubussimus
Jakubussimus
@wankstain: a może coś w stylu:

where ('X' IN (:A, :B, :C, :D, :E) and emp_id in (:A, :B, :C, :D, :E, 'Y')) or ('X' NOT IN (:A, :B, :C, :D, :E) and emp_id in (:A, :B, :C, :D, :E))
?
janek_
@wankstain: @Jakubussimus: @pwn3r:
a to nie chodzi o coś w stylu:

with pracownicy as (
select 'a' pracownik from dual union all
select
pwn3r
pwn3r
1
@janek_: no wlaśnie mało koleś wytlumaczyl co chce zrobić. Też bym kombinował z "with pracownicy as"
I tak przy okazji zamiast robic oddzielne selecty from dual z unionami np. w oraclu mozna zrobic cos takiego:
select * FROM sys.odcivarchar2list('A','B','C','D', 'E');

są wbudowane funkcje które ci z listy zrobią wygodnego selecta
bob9876
bob9876
@wankstain: Mała wskazówka co do wydajności Twoich zapytań - nie przekazuj dynamicznych wartości jako parametrów do IN... Baza każde takie zapytanie z inną liczbą elementów będzie traktowała jako oddzielne, co może skutkować przeróżnymi problemami. Lepiej wsadzić to w listę, użyć JSON_TABLE lub użyć funkcji "pipelined table" jeśli piszesz SQL typowo pod aplikację.
wankstain
wankstain Autor
0
@wankstain: przy czym nie może to być osobna procedura
pwn3r
pwn3r
0
@wankstain: może z where EXISTS?
wankstain
wankstain Autor
0
@Jakubussimus: o to chodziło, dziękuję
wankstain
wankstain Autor
0
@janek_: @pwn3r: no ok, ale jak tego użyć we where, gdzie zmienne A B C D E są wybierane przez użytkownika w GUI?
janek_
@wankstain: ale po co where? :) u mnie działa w ten sposób (wszystkie stringi traktuj jako placeholdery:)

select column_value as pracownik
from sys.odcivarchar2list('wartość_z_gui_A','wartość_z_gui_B','wartość_z_gui_C','wartość_z_gui_D', 'wartość_z_gui_E')
union
select
wankstain
wankstain Autor
0
@janek_: chodziło mi o to, że muszę wyselectować jakieś info o 5 pracownikach podanych w gui. Z tym, że jeśli wśród tych pięciu jest pracownik X, to dodatkowo wyciągnij info o jeszcze jednym, Y, którego nie dało się wybrać w gui. Na select wartość_z_innej_kontrolki_w_gui nie wpływa to, czy występowała wśród pięciu wartości_z_gui. Na pewno jej tam nie będzie. Ale jedna specyficzna wartość_z_gui musi spowodować, że wartość_z_innej_kontrolki zostanie uwzględniona. Mam
wankstain
wankstain Autor
0
@bob9876: jakie to mogą być problemy oprócz wydajności?