sql >> Databáze >  >> RDS >> PostgreSQL

Chování NOT LIKE s hodnotami NULL

O NULL

'anything' NOT LIKE NULL dává NULL , nikoli TRUE .
A pouze TRUE splňuje podmínky pro výrazy filtru v WHERE doložka.

Většina funkcí vrací NULL na NULL vstup (existují výjimky). To je povaha NULL v jakémkoli správné RDBMS.

Pokud si přejete single výraz, mohli byste použití:

AND   (column_default LIKE 'nextval%')  IS NOT TRUE;

To však není kratší nebo rychlejší. Podrobnosti v návodu.

Správný dotaz

Váš dotaz je stále nedůvěryhodný. Samotný název tabulky není v databázi Postgres jedinečný, musíte navíc zadat název schématu nebo se spolehnout na aktuální search_path najít v něm první shodu:

Související:

  • Jak parametr search_path ovlivňuje rozlišení identifikátoru a "aktuální schéma"
SELECT column_name
FROM   information_schema.columns
WHERE  table_name = 'hstore1'
AND    table_schema = 'public'   -- your schema
AND   (column_default IS NULL OR
       column_default NOT LIKE 'nextval%');

Lepší, ale stále ne neprůstřelné. Výchozí sloupec začínající 'nextval' nevytváří serial , dosud. Viz:

  • Automaticky zvyšovat sloupec tabulky

Pro jistotu zkontrolujte, zda je používaná sekvence „vlastněna“ sloupcem s pg_get_serial_sequence(table_name, column_name) .

Sám informační schéma používám jen zřídka. Tyto pomalé, nafouklé pohledy zaručují přenositelnost mezi hlavními verzemi – a zaměřují se na přenositelnost na jiné standardy vyhovující RDBMS. Ale příliš mnoho je stejně neslučitelné. Oracle ani neimplementuje informační schéma (od roku 2015).

V informačním schématu také chybí užitečné sloupce specifické pro Postgres. V tomto případě bych se mohl dotazovat na systémové katalogy takto:

SELECT *
FROM   pg_catalog.pg_attribute a
WHERE  attrelid = 'table1'::regclass
AND    NOT attisdropped   -- no dropped (dead) columns
AND    attnum > 0         -- no system columns
AND   NOT EXISTS (
   SELECT FROM pg_catalog.pg_attrdef d
   WHERE  (d.adrelid, d.adnum) = (a.attrelid, a.attnum)
   AND    d.adsrc LIKE 'nextval%'
   AND    pg_get_serial_sequence(a.attrelid::regclass::text, a.attname) <> ''
   );

Rychlejší a spolehlivější, ale méně přenosné.

Manuál:

Katalog pg_attrdef ukládá výchozí hodnoty sloupců. Hlavní informace o sloupcích jsou uloženy v pg_attribute (viz. níže). Zde budou mít položku pouze sloupce, které explicitně specifikují výchozí hodnotu (při vytvoření tabulky nebo přidání sloupce).

'table1'::regclass používá search_path k vyřešení názvu, čímž se zabrání dvojznačnosti. Název, který chcete přepsat, můžete kvalifikovat podle schématu:'myschema.table1'::regclass .

Související:

  • Najděte název odkazované tabulky pomocí názvu tabulky, pole a schématu
  • Získat výchozí hodnoty sloupců tabulky v Postgresu?


  1. Vymažte mezipaměť dotazů MySQL bez restartování serveru

  2. Konfigurace MySQL 8

  3. Analyzujte řetězec oddělený čárkami a vytvořte IN Seznam řetězců v klauzuli Where

  4. Jak funguje funkce LOCATE() v MySQL