sql >> Databáze >  >> RDS >> Mysql

MySql, Postgres, Oracle a SQLServer ignorující filtr IS NOT NULL

Chcete-li vynechat řádek z výsledku pokud některý ze zdrojů řádků pro stejné idvalue IS NULL , řešení v Postgres by bylo použít agregační funkci every() nebo (synonymum z historických důvodů) bool_and() v HAVING klauzule:

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);

SQL Fiddle.

Vysvětlete

Váš pokus s WHERE klauzule by pouze odstranila jednu zdrojový řádek pro id = 3 ve vašem příkladu (ten s colID = 1 ), ponechte dva další pro stejné id . Stále tedy dostáváme řádek pro id = 3 ve výsledku po agregaci.

Ale protože nemáme žádný řádek s colID = 1 , dostaneme prázdný řetězec (poznámka:ne NULL value!) pro fn ve výsledku pro id = 3 .

Rychlejším řešením v Postgresu by bylo použití crosstab() . Podrobnosti:

Další RDBMS

Zatímco EVERY je definován ve standardu SQL:2008, mnoho RDBMS jej nepodporuje, pravděpodobně proto, že některé z nich mají stinné implementace typu boolean. (Nevypouštět žádná jména jako "MySQL" nebo "Oracle" ...). Pravděpodobně všude (včetně Postgresu) můžete nahradit:

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);

Protože count() nepočítá hodnoty NULL. V MySQL je také bit_and() .Více pod touto související otázkou:



  1. mysql2 gem se nedaří zkompilovat s MySQL 5.6.12 na OS X s Homebrew

  2. Zobrazit řetězec z raise_application_error v programu Java

  3. Fuzzy párování řetězce v SQL

  4. codeigniter mysql left join include select