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

Opførsel af NOT LIKE med NULL-værdier

Om NULL

'anything' NOT LIKE NULL giver NULL , ikke TRUE .
Og kun TRUE kvalificerer til filterudtryk i en WHERE klausul.

De fleste funktioner returnerer NULLNULL input (der er undtagelser). Det er karakteren af ​​NULL i enhver korrekt RDBMS.

Hvis du ønsker en enkelt udtryk, du kunne brug:

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

Det er dog næppe kortere eller hurtigere. Detaljer i manualen.

Korrekt forespørgsel

Din forespørgsel er stadig upålidelig. Et tabelnavn alene er ikke unikt i en Postgres-database, du skal angive skemanavnet i tillæg eller stole på den aktuelle search_path for at finde det første match i den:

Relateret:

  • Hvordan påvirker søgestien identifikationsopløsning og det "aktuelle skema"
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%');

Bedre, men stadig ikke skudsikker. En kolonnestandard, der starter med 'nextval', laver ikke en serial , endnu. Se:

  • Automatisk stigning i tabelkolonnen

For at være sikker skal du kontrollere, om sekvensen i brug er "ejet" af kolonnen med pg_get_serial_sequence(table_name, column_name) .

Jeg bruger sjældent informationsskemaet selv. Disse langsomme, oppustede visninger garanterer portabilitet på tværs af større versioner - og sigter mod portabilitet til andre standard-kompatible RDBMS. Men for meget er alligevel uforeneligt. Oracle implementerer ikke engang informationsskemaet (fra 2015).

Desuden mangler nyttige Postgres-specifikke kolonner i informationsskemaet. I dette tilfælde kan jeg forespørge i systemkatalogerne som dette:

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

Hurtigere og mere pålidelig, men mindre bærbar.

Manualen:

Kataloget pg_attrdef gemmer kolonnens standardværdier. Hovedoplysningerne om kolonner er gemt i pg_attribute (se nedenunder). Kun kolonner, der eksplicit angiver en standardværdi (når tabellen oprettes eller kolonnen tilføjes), vil have en indgang her.

'table1'::regclass bruger search_path at løse navnet, hvilket undgår tvetydighed. Du kan skemakvalificere navnet til at tilsidesætte:'myschema.table1'::regclass .

Relateret:

  • Find det refererede tabelnavn ved hjælp af tabel-, felt- og skemanavn
  • Få standardværdierne for tabelkolonner i Postgres?


  1. Kan ikke installere PostgreSQL:Der opstod en fejl under udførelse af Microsoft VC++ runtime installationsprogrammet på Windows XP

  2. DATETIME2FROMPARTS() Eksempler i SQL Server (T-SQL)

  3. Tilslutning af PolyBase til Salesforce.com

  4. MySQL ENUM type vs join tabeller