#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 EMPID IN ( CASE WHEN 'X' IN (:A, :B, :C, :D, :E) THEN (:A, :B, :C, :D, :E, 'Y') ELSE (:A, :B, :C, :D, :E) )
with pracownicy as ( select 'a' pracownik from dual union all select 'b' pracownik from dual union all select 'c' pracownik from dual union all select 'd' pracownik from dual union all select 'e' pracownik from dual ) select pracownik from pracownicy union select 'x' from dual ?
@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
@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 'wartość_z_innej_kontrolki_w_gui' from dual wartość_z_innej_kontrolki_w_gui wyświetli się tylko jeśli nie ma jej wśród pięciu wartość_z_gui_ wklej sobie moje zapytanie do oracle'a i zobacz co się stanie :)
Ogólnie to nie wiadomo, o co chodzi w zadaniu, ale moim zdaniem moje rozwiązanie działa
@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 nadzieję,
@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ę.
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 EMPID IN (
CASE WHEN 'X' IN (:A, :B, :C, :D, :E) THEN (:A, :B, :C, :D, :E, 'Y') ELSE (:A, :B, :C, :D, :E)
)
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))
?
a to nie chodzi o coś w stylu:
with pracownicy as (
select 'a' pracownik from dual union all
select 'b' pracownik from dual union all
select 'c' pracownik from dual union all
select 'd' pracownik from dual union all
select 'e' pracownik from dual
)
select pracownik from pracownicy
union
select 'x' from dual
?
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
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 'wartość_z_innej_kontrolki_w_gui' from dual
wartość_z_innej_kontrolki_w_gui
wyświetli się tylko jeśli nie ma jej wśród pięciuwartość_z_gui_
wklej sobie moje zapytanie do oracle'a i zobacz co się stanie :)
Ogólnie to nie wiadomo, o co chodzi w zadaniu, ale moim zdaniem moje rozwiązanie działa
cc. @pwn3r:
wartość_z_innej_kontrolki_w_gui
nie wpływa to, czy występowała wśród pięciuwartości_z_gui
. Na pewno jej tam nie będzie. Ale jedna specyficznawartość_z_gui
musi spowodować, żewartość_z_innej_kontrolki
zostanie uwzględniona. Mam nadzieję,