Функция условного выражения GaussDB(DWS) возвращает неправильный набор результатов

Аннотация: Когда в функции условного выражения возникает несогласованность результирующего набора, мы должны сначала рассмотреть, приводит ли несогласованность типа данных входного параметра к несогласованности выходного параметра.

Эта статья опубликована в сообществе 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 впервые~

{{о.имя}}
{{м.имя}}

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/9210584
Recomendado
Clasificación