Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySql, Postgres, Oracle i SQLServer ignorowanie filtra NIE JEST NULL

Aby pominąć wiersz w wyniku jeśli którykolwiek z źródła wiersze dla tego samego id ma value IS NULL , rozwiązanie w Postgresie byłoby użycie funkcji agregującej every() lub (synonim ze względów historycznych) bool_and() w HAVING klauzula:

SELECT id
     , max(case when colID = 1 then value else '' end) AS fn
     , max(case when colID = 2 then value else '' end) AS ln
     , max(case when colID = 3 then value else '' end) AS jt
FROM   tbl 
GROUP  BY id
HAVING every(value IS NOT NULL);

Skrzypce SQL.

Wyjaśnij

Twoja próba z WHERE klauzula po prostu wyeliminuje jeden wiersz źródłowy dla id = 3 w twoim przykładzie (ten z colID = 1 ), pozostawiając jeszcze dwa dla tego samego id . Więc nadal otrzymujemy wiersz dla id = 3 w wyniku po agregacji.

Ale ponieważ nie mamy wiersza z colID = 1 , otrzymujemy pusty ciąg (uwaga:nie NULL wartość!) dla fn w wyniku dla id = 3 .

Szybszym rozwiązaniem w Postgresie byłoby użycie crosstab() . Szczegóły:

Inne RDBMS

Podczas gdy EVERY jest zdefiniowany w standardzie SQL:2008, wiele RDBMS go nie obsługuje, prawdopodobnie dlatego, że niektóre z nich mają podejrzane implementacje typu logicznego. (Nie upuszczaj żadnych nazw, takich jak "MySQL" lub "Oracle" ...). Prawdopodobnie możesz zastąpić wszędzie (w tym Postgres) za pomocą:

SELECT id
     , max(case when colID = 1 then value else '' end) AS fn
     , max(case when colID = 2 then value else '' end) AS ln
     , max(case when colID = 3 then value else '' end) AS jt
FROM   tbl 
GROUP  BY id
HAVING count(*) = count(value);

Ponieważ count() nie liczy wartości NULL. W MySQL istnieje również bit_and() .Więcej pod tym pytaniem:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. złożone zapytanie MySQL błędne wyniki

  2. Spring data kodowanie jpa utf-8 nie działa

  3. Najlepsza praktyka:Przechowuj wartości z dużych formularzy w bazie danych

  4. W jaki sposób strumienie reaktywne są używane w Slick do wstawiania danych?

  5. jak zamawiać według nazwy kolumny dynamicznej w EntityFramework?