sql >> Database >  >> RDS >> PostgreSQL

Is naam een ​​speciaal trefwoord in PostgreSQL?

Dit is een bekende verwarrende "functie" met een beetje geschiedenis. U kunt met name verwijzen naar tupels uit de tabel als geheel met de tabelnaam en vervolgens .name toevoegen zou de name . aanroepen functie op hen (d.w.z. het zou worden geïnterpreteerd als select name(t) from t ).

Op een bepaald moment in de PostgreSQL 9-ontwikkeling, Istr, werd dit een beetje opgeschoond. U kunt nog steeds select t from t expliciet om het rijen-als-tupels-effect te krijgen, maar u kunt een functie niet op dezelfde manier toepassen. Dus op PostgreSQL 8.4.9 , dit:

create table t(id serial primary key, value text not null);
insert into t(value) values('foo');
select t.name from t;

produceert het bizarre:

  name   
---------
 (1,foo)
(1 row)

maar op 9.1.1 produceert:

ERROR:  column t.name does not exist
LINE 1: select t.name from t;
               ^

zoals je zou verwachten.

Dus, om specifiek je vraag te beantwoorden:name is een standaardtype in PostgreSQL (gebruikt in de catalogus voor tabelnamen enz.) en ook enkele standaardfuncties om dingen om te zetten naar de name type. Het is niet echt gereserveerd, alleen de objecten die zo bestaan, plus een historische vreemde syntaxis, maakten de zaken verwarrend; en dit is opgelost door de ontwikkelaars in recente versies.



  1. Beperk resultaten op een GROUP_CONCAT() of INNER JOIN

  2. Verschil in het omgaan met de spaties tussen Oracle en SQL Server

  3. SQL Server en de Spectre/Meltdown-kwetsbaarheden

  4. Waarom kan ik een bindvariabele niet gebruiken in een execute instant-instructie?