PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Comportamento di NOT LIKE con valori NULL

Informazioni su NULL

'anything' NOT LIKE NULL restituisce NULL , non TRUE .
E solo TRUE si qualifica per le espressioni di filtro in un WHERE clausola.

La maggior parte delle funzioni restituisce NULL su NULL input (ci sono delle eccezioni). Questa è la natura di NULL in qualsiasi RDBMS corretto.

Se desideri un single espressione, potresti usa:

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

Non è certo più breve o più veloce, però. Dettagli nel manuale.

Richiesta corretta

La tua domanda è ancora inaffidabile. Il nome di una tabella da solo non è univoco in un database Postgres, è necessario specificare il nome dello schema in aggiunta o fare affidamento sull'attuale search_path per trovare la prima corrispondenza in esso:

Correlati:

  • In che modo il percorso_ricerca influenza la risoluzione dell'identificatore e lo "schema corrente"
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%');

Migliore, ma non ancora a prova di proiettile. Una colonna predefinita che inizia con 'nextval' non crea un serial , ancora. Vedi:

  • Colonna tabella con incremento automatico

Per essere sicuro, controlla se la sequenza in uso è "di proprietà" della colonna con pg_get_serial_sequence(table_name, column_name) .

Raramente uso personalmente lo schema delle informazioni. Quelle viste lente e gonfie garantiscono la portabilità tra le versioni principali e mirano alla portabilità verso altri RDBMS conformi agli standard. Ma il troppo è comunque incompatibile. Oracle non implementa nemmeno lo schema delle informazioni (a partire dal 2015).

Inoltre, nello schema delle informazioni mancano utili colonne specifiche di Postgres. Per questo caso potrei interrogare i cataloghi di sistema in questo modo:

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

Più veloce e più affidabile, ma meno portatile.

Il manuale:

Il catalogo pg_attrdef memorizza i valori predefiniti delle colonne. Le informazioni principali sulle colonne sono memorizzate in pg_attribute (vedi sotto). Solo le colonne che specificano in modo esplicito un valore predefinito (quando viene creata la tabella o viene aggiunta la colonna) avranno una voce qui.

'table1'::regclass utilizza il search_path per risolvere il nome, che evita ambiguità. Puoi qualificare come schema il nome da sovrascrivere:'myschema.table1'::regclass .

Correlati:

  • Trova il nome della tabella di riferimento utilizzando la tabella, il campo e il nome dello schema
  • Ottieni i valori predefiniti delle colonne della tabella in Postgres?