2016-06-27 17 views
0

результата следующего запроса меня раздражает:Целый или 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.

+0

Под «терминалом» я подозреваю, что вы имеете в виду «буквальный». В том же руководстве, которое вы указали [указывает] (https://www.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/com.ibm.db2z11.doc.sqlref/src/tpc/db2z_implicitcaststr2num.html), типы символов неявно переводится в 'DECFLOAT (34)' при необходимости. – mustaccio

+0

@mustaccio Да, извините за плохую формулировку, я имел в виду «буквальный». Я считаю, что проблема не имеет ничего общего с кастомизацией персонажа; выбор только завернут в char() - функцию, чтобы показать точность/масштаб результата. –

+0

"Integer" literal ''1'' не является целым числом, это символ буква. Может быть, вы могли бы перефразировать вопрос, потому что сейчас не совсем понятно, в чем ваша проблема. – mustaccio

ответ

2

Все числовые константы, которые вписываются в большое целое число, интерпретируются как таковые, за исключением случаев, когда они не являются, спасибо IBM;).

В вашем втором случае вы должны увидеть контекст, в котором появляется литерал, который находится внутри арифметического выражения. Поведение явно описано в разделе "Arithmetic with an integer and a decimal operand" в SQLReference:

временная копия целого числа, которое было преобразовано в десятичное число имеет точность р и масштаб 0. р 19 для большого числа, 11 для большого целого числа и 5 для небольшого целого числа. В случае целочисленной константы p зависит от количества цифр в целочисленной константе. p равно 5 для целочисленной константы, состоящей из 5 цифр или меньше. В противном случае p совпадает с числом цифр в целочисленной константе.

Таким образом, обработка констант отличается от всех видов «встроенных» двоичных типов данных. Постоянное значение (хотя и двоичное по определению) трактуется больше как десятичная константа.