PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Какво е правилото за „неизвестен“ и извод за тип?

Всъщност има три въпроса, на които ще се опитам да отговоря.

  1. Каква е целта на unknown ?

    Това е типът данни, първоначално присвоен на NULL и низови литерали в SQL изрази. Ако на такива литерали е присвоен тип text незабавно би било трудно да се направи извод за правилния тип.

    Например искате myfunc('hello') за извикване на myfunc(character varying) , но няма имплицитно преобразуване на тип от text към character varying (и би причинило неяснота, ако сте създали такъв).

  2. Защо SELECT null връща колона от тип unknown ?

    Традиционният отговор е:Защото потребителят не е посочил типа.

    Това поведение обаче е проблематично. Например, ако създадете таблица като тази:

    CREATE TABLE test
       AS SELECT 'hello';
    

    ще получите колона от тип unknown , което е нежелателно и ще създава проблеми по-нататък. Типът unknown наистина не трябва да се вижда от потребителя, а по-скоро детайл от изпълнението.

    Следователно този ангажимент промени поведението от PostgreSQL v10 на:Сега всеки unknown остава в SELECT или RETURNING списък са принудени да text и не могат да се създават таблици с колони от тип unknown .

  3. Защо SELECT NULL UNION SELECT 42 работи, но не SELECT NULL UNION SELECT NULL UNION SELECT 42 ?

    Това се дължи на правилата за преобразуване на типове .UNION остава асоциативен, така че последната заявка се интерпретира като

    (SELECT NULL UNION SELECT NULL) UNION SELECT 42;
    

    Сега първият UNION разрешава до тип данни text поради правило 3:

    Това причинява грешка при опит за разрешаване на типа за втория UNION поради правило 4:

    От друга страна, в заявката

    SELECT NULL UNION SELECT 42;
    

    „NULL“ има тип unknown , а „42“ има тип integer (избраният тип за числови литерали без десетична запетая).

    Правило 5

    не се прилага тук, защото integer не е предпочитан тип в своята категория (това би било oid и double precision ), затова се използва правило 6:

    Това води до тип 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. каква е ползата от тип масив?

  2. Най-добрият начин да изтриете милиони редове по ID

  3. Как работи функцията Power() в PostgreSQL

  4. Обобщена заявка за 50M+ таблица с редове в PostgreSQL

  5. Преобразувайте набор от резултати от SQL масив в масив от низове