sql >> Databasteknik >  >> RDS >> PostgreSQL

Vad är regeln för "okänt" och typinferens?

Det finns faktiskt tre frågor där som jag ska försöka besvara.

  1. 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 anropa myfunc(character varying) , men det finns ingen implicit typ cast från text till character varying (och det skulle orsaka tvetydighet om du skapade en).

  2. Varför är SELECT null returnera en kolumn av typen unknown ?

    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. Typen unknown borde egentligen inte vara synlig för användaren, utan snarare en implementeringsdetalj.

    Följaktligen är this commit har ändrat beteendet från PostgreSQL v10 på:Nu någon unknown s kvar i en SELECT eller RETURNING listan tvingas text , och tabeller kan inte skapas med kolumner av typen unknown .

  3. Varför väljer SELECT NULL UNION SELECT 42 fungerar, men inte SELECT 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 datatypen text 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 typen integer (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 vara oid och double precision ), så regel 6 används:

    Detta resulterar i en typ av integer .




  1. Hur man infogar en array i en enda MySQL Prepared statement med PHP och PDO

  2. Uppdatera summan baserat på föregående saldorad

  3. Rensa effektivt användarinmatad text

  4. Autoinkrementera ett fält tills ett visst villkor är uppfyllt mysql