результата следующего запроса меня раздражает:Целый или Smallint для числового буквального
select
char(coalesce(1, cast(5 as decimal(2,0)))) as a,
char(1 * cast(5 as decimal(2, 0))) as b
from sysibm.sysdummy1;
a = ' 00000000001.'
b = ' 0000005.'
Возвращаемого значение первого выбора, очевидно, типа десятичных (11,0). Унификация типа функции коалесценции документируется here (см. Числовые операнды). Следуя этим инструкциям и разрешая десятичную (11,0) обратную, означает, что буква 1 интерпретируется как большое целое число.
Тип возврата второго выбора - десятичный (7,0). Как поведение DB2 при умножении может быть прочитано here (точность результата представляет собой сумму точности обоих операндов). В этом случае это означает, что буква 1 интерпретируется как небольшое целое число.
Обратите внимание, что функция char(..)
применяется только для отображения точности и масштаба возвращаемого значения.
При наличии целочисленного литерала (например, 1
в приведенном выше примере), как узнать, как DB2 интерпретирует его (smallint, largeint, bigint)?
Я использую DB2 для z/OS v11.
Под «терминалом» я подозреваю, что вы имеете в виду «буквальный». В том же руководстве, которое вы указали [указывает] (https://www.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/com.ibm.db2z11.doc.sqlref/src/tpc/db2z_implicitcaststr2num.html), типы символов неявно переводится в 'DECFLOAT (34)' при необходимости. – mustaccio
@mustaccio Да, извините за плохую формулировку, я имел в виду «буквальный». Я считаю, что проблема не имеет ничего общего с кастомизацией персонажа; выбор только завернут в char() - функцию, чтобы показать точность/масштаб результата. –
"Integer" literal ''1'' не является целым числом, это символ буква. Может быть, вы могли бы перефразировать вопрос, потому что сейчас не совсем понятно, в чем ваша проблема. – mustaccio