Как получить db2 без каких-либо добавленных значений

select rtrim(char(PKG_AGR_IDR)),rtrim(char(STA_DTE)) 
from test FETCH FIRST 10 ROW ONLY


"0010000010. 2014-03-14"
"0010000010. 2014-03-14"

Мне нужны данные, как показано ниже:

0010000010 2014-03-14

Я планирую написать скрипт для выполнения rtrim(char(fieldname)), есть ли комбинация функций, с помощью которой я могу получить правильный вывод для обоих полей.

2 ответа

Решение

Можно было бы предположить, что ОП, возможно, было написано больше как следующее, чтобы лучше описать сценарий:

Будет включена некоторая предыстория о том, что делается, так что более поздние ссылки [например, на field_name] будут объясняться ранее, а не быть интуитивно понятными рецензентом.

Цель состоит в том, чтобы включить динамическую генерацию оператора SQL SELECT, который будет извлекать символьное представление данных из столбцов указанной таблицы TABLE. Учитывая DDL create table THE_SCHEMA.TEST ( PKG_AGR_IDR NUMERIC(10, 0), STA_DTE DATE ) и учитывая следующий DML, используемый для заполнения этой таблицы с строкой образца insert into THE_SCHEMA.TEST VALUES(10000010. '2014-03-14') желательно получить результирующий набор [ограниченный первыми десятью строками для целей тестирования], который бы включал данные из каждого столбца [таблицы TEST в THE_SCHEMA] в качестве данных VARCHAR, полученных из следующего запрос, который был бы сгенерирован из метаданных, хранящихся в каталоге SYSCOLUMNS VIEW:
select rtrim(char(PKG_AGR_IDR)),rtrim(char(STA_DTE))
from test
FETCH FIRST 10 ROW ONLY

Единственное выражение, сгенерированное как 'RTRIM(CHAR(' CONCAT COLUMN_NAME CONCAT '))' из данных SYSCOLUMNS, как видно дважды в запросе, отмеченном ранее, кажется, что он не может дать желаемых результатов при применении к имени столбца независимо от значения DATA_TYPE для COLUMN_NAME, отформатированного этим символьным выражением. В частности, например, результат динамически сгенерированного запроса select RTRIM(CHAR(PKG_AGR_IDR)), RTRIM(CHAR(STA_DTE)) from THE_SCHEMA.TEST FETCH FIRST 10 ROW ONLY производит следующий вывод:

0010000010. 2014-03-14

Однако ожидаемый \ желаемый результат будет:

0010000010 2014-03-14

Существует ли какое-либо выражение типа RTRIM(CHAR(column_name)), которое будет функционировать для всех столбцов в TABLE, чтобы получать данные в виде символьной строки, независимо от типа данных столбцов, будь они числовые, varchar или дата?

Но даже с этим более полным описанием сценария \ фона:

Утверждения о том, что является выводом из исходного выражения, являются неожиданными из скалярного преобразования CHAR, приводящего к преобразованию десятичных чисел в символы, по крайней мере для DB2 для i, для которого SQL-данные упакованного десятичного (DECIMAL) и зонного десятичного (NUMERIC) данных нуля типы представляются без десятичного разделителя [он же десятичная точка], несмотря на необязательный десятичный символ в качестве второго аргумента. Также скаляр CHAR пропускает начальные нули при приведении числовых значений. Таким образом, DB2 для i SQL получил бы результат строки '10000010' а не любой из '0010000010.' или же '10000010.'

Я полагаю, что проблема может быть связана с DB2 for Z или DB2 LUW, и, возможно, эта тема была неправильно помечена DB2 for i? Или, может быть, существует [n unstated] беспокойство по поводу очевидной несовместимости между вариантами DB2? Тем не менее, прочитав документацию, описанные результаты кажутся противоречащими тому, что задокументировано, поэтому я подозреваю, что настоящая проблема для OP может быть связана с обнаружением дефекта [в любом неустановленном варианте DB2 и используемом уровне выпуска ].?

Я не ожидаю, что будет какое-либо одно выражение, которое будет выполнять то, что требуется для каждого из числовых значений, VARCHAR и DATE [или для каждого из целых чисел, SMALLINT, NUMERIC, DECIMAL, VARCHAR и DATE]. Для пропуска десятичной точки SQL DB2 для i, вероятно, больше всего похож на то, что выражается по желанию, но тогда ведущие нули всегда обрезаются http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/db2/rbafzscachar.htm

... Ведущие нули не возвращаются. Конечные нули возвращаются. Если масштаб десятичного выражения равен нулю, десятичный символ не возвращается....

DB2 LUW SQL кажется, по крайней мере, несколько непоследовательным в отношении темы начальных нулей, поскольку пример 6 не предлагает ничего, а затем пример 7 показывает, что они есть, но, как и в приведенной выше ссылке на документ, очевидно, что не должно быть начальных нулевых символов http://www.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000777.html

... Ведущие нули не включены. Конечные нули включены.... Если масштаб десятичного выражения равен нулю, десятичный символ не возвращается....

Я не исследовал ссылку на документ DB2 for Z.

Я ожидаю, что решение повлечет за собой использование выражения CASE, возможно, для значения DATA_TYPE. Это то, что я делал, кодируя что-то подобное, хотя я просто использовал скаляр литья VARCHAR и не делал обрезку. Однако мое требование к CASE было не в том, чтобы хранить первые нулевые символы, а в основном для выбора правильного символа десятичного разделителя. И поскольку второй аргумент десятичный символ [для CHAR или VARCHAR] не разрешен для числовых типов INTEGER [sqlcode -171 или SQL0171], выражение CASE только для числовых типов будет в достаточной степени разрешено с использованием только следующего выражения CASE WHEN DATA_TYPE IN ('INTEGER', 'SMALLINT', 'BIGINT') THEN ', ' concat DecSep concat ')' ELSE ')' добавлен в 'VARCHAR(' concat где DecSep - это односимвольная переменная с запятой или точкой в ​​качестве выбранного десятичного разделителя. Тем не менее, поскольку второй аргумент [для CHAR или VARCHAR] специфичен для типа данных первого аргумента, типы данных символ и дата \ время имели свое собственное выражение CASE. CASE WHEN DATA_TYPE IN ('DATE', 'TIME') THEN ', ' concat StdFmt concat ')' ELSE ')' добавлен в 'VARCHAR(' concat где StdFmt была трехсимвольной переменной, имеющей одну из спецификаций формата стандартов ISO, США, EUR или JIS.

Не уверен, что вы спрашиваете. Удалить двойные кавычки? удалить точку? Вы можете сделать substr, указав первую и последнюю позицию, а также объединить два значения.

select substr(trim(PKG_AGR_IDR), 2, 11) || ' ' ||  trim(char(STA_DTE))
from test FETCH FIRST 10 ROW ONLY
Другие вопросы по тегам