sql >> Database >  >> RDS >> PostgreSQL

Gedrag van NOT LIKE met NULL-waarden

Over NULL

'anything' NOT LIKE NULL geeft NULL , niet TRUE .
En alleen TRUE komt in aanmerking voor filterexpressies in een WHERE clausule.

De meeste functies retourneren NULL op NULL invoer (er zijn uitzonderingen). Dat is de aard van NULL in elke juiste RDBMS.

Als je een single wilt hebben uitdrukking, je zou gebruik:

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

Dat is echter nauwelijks korter of sneller. Details in de handleiding.

Juiste zoekopdracht

Je vraag is nog steeds onbetrouwbaar. Een tabelnaam alleen is niet uniek in een Postgres-database, u moet daarnaast de schemanaam opgeven of vertrouwen op het huidige search_path om de eerste overeenkomst erin te vinden:

Gerelateerd:

  • Hoe beïnvloedt het zoekpad de resolutie van de ID en het "huidige schema"
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%');

Beter, maar nog steeds niet kogelvrij. Een standaardkolom die begint met 'nextval' maakt geen serial , nog. Zie:

  • Tabelkolom automatisch verhogen

Controleer voor de zekerheid of de gebruikte reeks "eigendom" is van de kolom met pg_get_serial_sequence(table_name, column_name) .

Zelf gebruik ik het informatieschema zelden. Die trage, opgeblazen weergaven garanderen overdraagbaarheid tussen belangrijke versies - en zijn gericht op overdraagbaarheid naar andere standaard-compatibele RDBMS. Maar te veel is sowieso onverenigbaar. Oracle implementeert niet eens het informatieschema (vanaf 2015).

Ook ontbreken er bruikbare Postgres-specifieke kolommen in het informatieschema. In dit geval zou ik de systeemcatalogi als volgt kunnen doorzoeken:

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

Sneller en betrouwbaarder, maar minder draagbaar.

De handleiding:

De catalogus pg_attrdef slaat standaardwaarden voor kolommen op. De belangrijkste informatie over kolommen wordt opgeslagen in pg_attribute (zie onder). Alleen kolommen die expliciet een standaardwaarde specificeren (wanneer de tabel wordt gemaakt of de kolom wordt toegevoegd) hebben hier een vermelding.

'table1'::regclass gebruikt het search_path om de naam op te lossen, wat dubbelzinnigheid vermijdt. U kunt de naam schema-kwalificeren om te overschrijven:'myschema.table1'::regclass .

Gerelateerd:

  • Zoek de tabelnaam waarnaar wordt verwezen met behulp van tabel-, veld- en schemanaam
  • De standaardwaarden van tabelkolommen in Postgres ophalen?


  1. Vind huidige vacatures voor Oracle Forms &Reports

  2. Hoe ResultSet te retourneren van opgeslagen procedure in Oracle?

  3. Hoe PostgreSQL High Availability te bereiken met pgBouncer

  4. Transponeer een set rijen als kolommen in SQL Server 2000