Аннотация: Когда в функции условного выражения возникает несогласованность результирующего набора, мы должны сначала рассмотреть, приводит ли несогласованность типа данных входного параметра к несогласованности выходного параметра.
Эта статья опубликована в сообществе HUAWEI CLOUD « Функция условного выражения GaussDB (DWS) возвращает ошибку при поиске и устранении неполадок », автор: yd_211369925.
(1) Предыстория дела
Клиент использует наибольшую для получения и возврата значения выражения с наибольшим значением в списке параметров, а результат запроса в подзапросе несовместим с результатами подзапроса, выступающего и выполняющего результирующий набор отдельно.
select greatest(1,2,100,-1,0,nvl(null,0)) --结果为2,select nvl(null,0)的结果为0
select greatest(1,2,100,-1,0,0) --结果为100
(2) Устранение неполадок
Прежде всего, нам нужно понять, как использовать две функции: great и nvl.
Клиент использует версию dws820, среда находится в режиме совместимости с mysql, а тип результата nvl(null,0) неизвестен, то есть текст;
В первом наибольшем(1,2,100,-1,0,nvl(null,0)) параметре int и text, то есть сортировка по символу самая большая;
Параметры второго по величине (1,2,100,-1,0) являются целыми числами, а выходные данные сортируются по значению 100, которое является наибольшим;
расширять:
Для некоторых неусловных функций выражения вы можете использовать имя функции \df+ (min используется здесь в качестве примера), чтобы найти типы данных входных и выходных параметров.
Или сначала используйте select proname, proisstrict, provolatile, prorettype, proargtypes, prosrc, proshippable из pg_proc, где proname = 'имя функции';
Затем используйте select oid, typename из pg_type, где oid = 'xxx'; (здесь oid запрашивается в соответствии с приведенным выше prorettype, proargtypes)
Ссылка на важный атрибут конкретной функции
Введение атрибута pushdown функции GaussDB (DWS)
https://bbs.huaweicloud.com/blogs/250351
(3) Решения
Из приведенного выше исследования видно, что первое выражение следует переписать, а nvl(null, 0) заменить на nvl(null,0)::int, чтобы все типы данных в наибольшей функции были int.
SELECT greatest(1,2,100,-1,0,nvl(null,0)::int)
В настоящее время результатом является то, что 100 соответствует ожидаемому заказчиком результату.
Нажмите, чтобы подписаться и узнать о свежих технологиях Huawei Cloud впервые~