Това се решава от правилата на Разделителна способност на типа функция . Подробно обяснение в ръководството. Свързано:
- Има ли начин да деактивирате претоварването на функциите в Postgres
NULL без изрично привеждане на тип започва като тип "неизвестен":
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
Всъщност, Подозрях се и направих бърз тест, само за да намеря различни резултати в Postgres 9.3 и 9.4. varchar
се избира над integer
(което странно противоречи на вашите констатации):
SQL Fiddle.
Мисля, че съответното правило е точка 4д в списъка (никоя от по-ранните точки не решава мача):
На всяка позиция изберете низовата категория, ако някой кандидат приема тази категория. (Това пристрастие към низ е подходящо, тъй като литералът от неизвестен тип изглежда като низ.)
Ако сте добавили друга функция с тип на въвеждане text
към претоварения микс, text
ще бъде избран през varchar
.
Лично аз почти винаги използвайте text
вместо varchar
. Макар че е двоично съвместим (така че почти, но не съвсем същият), text
е по-близо до сърцето на Postgres във всяко отношение.
Добавих това към цигулката, както и друг пример, когато Postgres не може да вземе решение и изпада в гняв.
Ако искате да изберете конкретна функция, добавете изрично привеждане на типа (това е начинът да отидете тук!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;