Det finns faktiskt tre frågor där som jag ska försöka besvara.
-
Vad är syftet med
unknown
?Detta är den datatyp som ursprungligen tilldelades NULL och strängliteral i SQL-satser. Om sådana bokstaver tilldelades skriv
text
omedelbart skulle det vara svårt att sluta sig till rätt typ.Till exempel vill du ha
myfunc('hello')
för att anropamyfunc(character varying)
, men det finns ingen implicit typ cast fråntext
tillcharacter varying
(och det skulle orsaka tvetydighet om du skapade en). -
Varför är
SELECT null
returnera en kolumn av typenunknown
?Det traditionella svaret är:Eftersom användaren inte angav typen.
Detta beteende har dock varit problematiskt. Till exempel, om du skapar en tabell så här:
CREATE TABLE test AS SELECT 'hello';
du skulle sluta med en kolumn av typen
unknown
, vilket är oönskat och kommer att orsaka problem längre fram. Typenunknown
borde egentligen inte vara synlig för användaren, utan snarare en implementeringsdetalj. -
Varför väljer
SELECT NULL UNION SELECT 42
fungerar, men inteSELECT NULL UNION SELECT NULL UNION SELECT 42
?Detta beror på typkonverteringsreglerna .
UNION
lämnas associativ, så den senare frågan tolkas som(SELECT NULL UNION SELECT NULL) UNION SELECT 42;
Nu den första
UNION
löser sig till datatypentext
på grund av regel 3:Detta orsakar ett fel när man försöker lösa typen för den andra
UNION
på grund av regel 4:Å andra sidan, i frågan
SELECT NULL UNION SELECT 42;
"NULL" har typen
unknown
, och "42" har typeninteger
(den typ som valts för numeriska bokstaver utan decimalkomma).Regel 5
gäller inte här, eftersom
integer
är inte en föredragen typ i sin kategori (det skulle varaoid
ochdouble precision
), så regel 6 används:Detta resulterar i en typ av
integer
.