PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jaka jest reguła „nieznanego” i wnioskowania o typie?

W rzeczywistości są tam trzy pytania, na które postaram się odpowiedzieć.

  1. Jaki jest cel unknown ?

    Jest to typ danych początkowo przypisany do wartości NULL i literałów łańcuchowych w instrukcjach SQL. Jeśli takie literały zostały przypisane, wpisz text od razu trudno byłoby wywnioskować właściwy typ.

    Na przykład chcesz myfunc('hello') wywołać myfunc(character varying) , ale nie ma niejawnego rzutowania typu z text na character varying (i spowodowałoby to niejednoznaczność, gdybyś je stworzył).

  2. Dlaczego SELECT null zwrócić kolumnę typu unknown ?

    Tradycyjna odpowiedź brzmi:ponieważ użytkownik nie określił typu.

    Jednak to zachowanie było problematyczne. Na przykład, jeśli utworzysz taką tabelę:

    CREATE TABLE test
       AS SELECT 'hello';
    

    skończysz z kolumną typu unknown , co jest niepożądane i spowoduje dalsze problemy. Typ unknown naprawdę nie powinien być widoczny dla użytkownika, ale raczej szczegół implementacji.

    W związku z tym to zatwierdzenie zmienił zachowanie z PostgreSQL v10 na:Teraz każdy unknown s pozostały w SELECT lub RETURNING lista jest zmuszona do text , a tabel nie można tworzyć z kolumnami typu unknown .

  3. Dlaczego SELECT NULL UNION SELECT 42 działa, ale nie SELECT NULL UNION SELECT NULL UNION SELECT 42 ?

    Wynika to z zasad konwersji typów .UNION jest skojarzone, więc drugie zapytanie jest interpretowane jako

    (SELECT NULL UNION SELECT NULL) UNION SELECT 42;
    

    Teraz pierwszy UNION zamienia się na typ danych text z powodu zasady 3:

    Powoduje to błąd podczas próby rozwiązania typu dla drugiej UNION z powodu zasady 4:

    Z drugiej strony w zapytaniu

    SELECT NULL UNION SELECT 42;
    

    „NULL” ma typ unknown , a „42” ma typ integer (typ wybrany dla literałów numerycznych bez kropki dziesiętnej).

    Zasada 5

    nie ma tu zastosowania, ponieważ integer nie jest preferowanym typem w swojej kategorii (to byłoby oid i double precision ), więc stosowana jest zasada 6:

    Daje to typ integer .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyrównanie planetarne

  2. PostGIS - konwertuj wielokąt na pojedynczy wielokąt

  3. PostgreSQL INSERT ON CONFLICT UPDATE (upsert) użyj wszystkich wykluczonych wartości

  4. Jak wypróbować wiele opcji SELECT, aż wynik będzie dostępny?

  5. Usuwanie elementu z tablicy w obiekcie JSONB