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
textomedelbart 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åntexttillcharacter varying(och det skulle orsaka tvetydighet om du skapade en). -
Varför är
SELECT nullreturnera 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. Typenunknownborde egentligen inte vara synlig för användaren, utan snarare en implementeringsdetalj. -
Varför väljer
SELECT NULL UNION SELECT 42fungerar, men inteSELECT NULL UNION SELECT NULL UNION SELECT 42?Detta beror på typkonverteringsreglerna .
UNIONlämnas associativ, så den senare frågan tolkas som(SELECT NULL UNION SELECT NULL) UNION SELECT 42;Nu den första
UNIONlöser sig till datatypentextpå grund av regel 3:Detta orsakar ett fel när man försöker lösa typen för den andra
UNIONpå 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 varaoidochdouble precision), så regel 6 används:Detta resulterar i en typ av
integer.