Czy SQL pozwala na wykonanie alternatywnego warunku w where jeśli nie znajdzie nic dla pierwszego?

0

Czy SQL pozwala na wykonanie alternatywnego warunku w where jeśli nie znajdzie nic dla pierwszego?

select *
from Products
where catId = 5 and (NAME = 'aaa' or NAME is null)

chodzi o to że jeśli znajdzie już produkty z aaa to żeby nie szukało nullowych i odwrotnie jeśli nie znajdzie aaa to żeby znalazło te z nullem. Jeśli nie ma na to prostego sposobu to czy taki bardziej skomplikowany będzie bardziej wydajny niż wykonanie po prostu drugiego zapytania jeśli nie znajdzie nic w pierwszym?

Dodam że dla tego przykładowego aaa może być wiele wyników, a nie tylko 1.

0

Chyba najprościej zrobić to procedurą gdzie sprawdzi czy 1 zapytanie zwróciło jakieś rekordy i jeśli tak to zapytanie 1, a jeśli nie to zapytanie 2.

3

Da się to zrobić w jednym zapytaniu:

select *
from Products
where 
     catId = 5 
     and (
            NAME = 'aaa' 
              or ( 
             NAME is null and not exists(select * from products where catid=5 and name = 'aaa')
             )
       )
0

Chodzi też o to że mam podobne rekordy i w jednym jest aaa a w drugim null i jeśli nie ma aaa to chcę żeby wybrało tylko ten z nullem. Przykładowo:

1; 5; bbb; aaa;
2; 5; bbb; null;
3; 5; ccc; null; 

Powinno zwrócic 1 i 3

0

Niestety rozwiązanie podane przez @Panczo zwraca tylko 1, a potrzebuję aby zwracało 1 i 3 tak jak pokazałem w poprzednim poście.

2
zaylin napisał(a):

Niestety rozwiązanie podane przez @Panczo zwraca tylko 1, a potrzebuję aby zwracało 1 i 3 tak jak pokazałem w poprzednim poście.

Tak to jest jak się opisuje problem Z, a liczy na rozwiązanie problemu Y...

Nadal się da:

select *
from Products
where 
     catId = 5 
     and (
            NAME = 'aaa' 
              or ( 
             NAME is null and not exists(select * from products p where catid=5 and p.nazwa=products.nazwa and name = 'aaa')
             )
       )
0

Powyższe zapytanie jest niepoprawne. Wskazówki były dobre, ale zapytanie powinno wyglądać tak http://sqlfiddle.com/#!4/36d1d5/9:

create table Products(
  ID NUMBER(18) not null,
  catId NUMBER(18),
  type varchar(20),
  nazwa varchar(20)
);


insert into Products(ID, catId, type, nazwa) values (1, 5, 'bbb', 'aaa');
insert into Products(ID, catId, type, nazwa) values (2, 5, 'bbb', null);
insert into Products(ID, catId, type, nazwa) values (3, 5, 'ccc', null);

select *
from Products p
where 
     p.catId = 5 
     and (
            p.nazwa = 'aaa' 
              or ( 
             p.nazwa is null and not exists(select null 
                                            from Products p2 
                                            where p2.catid=5 
                                            and p.TYPE = p2.TYPE 
                                            and p2.nazwa = 'aaa'
                                           )
             )
       );
4

Powyższe zapytanie jest niepoprawne. Wskazówki były dobre, ale zapytanie powinno wyglądać tak

Moje zapytanie jest dokładnie takie samo jakie ty zrobiłeś. Nie mam szklanej kuli, żebu wiedzieć, że ty nazwałes kolumnę TYPE bo nigdzie tego nie napisałeś.... Zamiast narzekać, że nie dostajesz "prawidłowych" rozwiązań, naucz się przedstawiać problem.

3
zaylin napisał(a):

Czy SQL pozwala na wykonanie alternatywnego warunku w where jeśli nie znajdzie nic dla pierwszego?

To ja was wszystkich pogodzę.
Poniżej jest najbardziej poprawna odpowiedź na zadane pytanie...

Tak, SQL pozwala na wykonanie alternatywnego warunku w where jeśli pierwszy warunek w where nie zostanie spełniony.

0
select * from products where catId=5 and if(exists(select 1 from products where catId=5 and nazwa='aaa'), nazwa='aaa', nazwa is null);

Powyżej odpowiedź na pytanie zadane w pierwszym wpisie, ale z czwartego wpisu wynika że autorowi wątku chodziło o zupełnie co innego, przypadkiem
nie o zwykłe grupowanie wg atrybutu "type" ?:

select * from products where catId=5 group by type;
1

Można użyć też row_number() i jest dużo prościej:

Select
 *
FROM (
select 
    ID
    ,catId
    ,type
    ,nazwa
    ,row_number() over (partition by catid, type order by nazwa) r
from 
    Products p
where
  catID = 5
  and (nazwa = 'aaa' or nazwa is null)) dt
 where r = 1

1 użytkowników online, w tym zalogowanych: 0, gości: 1