如何获取没有任何附加值的db2

时间:2014-07-16 10:10:11

标签: db2 db2-luw db2-connect db2-400

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 个答案:

答案 0 :(得分:1)

为了更好地描述场景,有人可能会认为OP可能更像下面的内容:

将包含有关正在完成的工作的一些背景知识,以便以后的参考资料[例如field_name]将被解释,而不是必须由评论者直观。

目的是启用动态生成SQL SELECT语句,该语句将从指定TABLE的列中检索数据的字符表示形式。给定DDL create table THE_SCHEMA.TEST ( PKG_AGR_IDR NUMERIC(10, 0), STA_DTE DATE )并给出以下用于使用样本行insert into THE_SCHEMA.TEST VALUES(10000010. '2014-03-14')填充该TABLE的DML,所需要的是获得结果集[限于前十行用于目的测试]包括来自[TH_SCHEMA中名为TEST的TABLE]的每列的数据作为VARCHAR数据,由以下查询产生,该查询将从存储在SYSCOLUMNS目录中的元数据生成VIEW:
{{ 1}}

从SYSCOLUMNS数据中生成为 select rtrim(char(PKG_AGR_IDR)),rtrim(char(STA_DTE))
from test
FETCH FIRST 10 ROW ONLY
的单个表达式(在前面提到的查询中看到过两次)似乎无法在应用于列名时提供理想的结果,而与COLUMN_NAME的DATA_TYPE的值无关由该字符表达式格式化。具体来说,例如,动态生成的查询'RTRIM(CHAR(' CONCAT COLUMN_NAME CONCAT '))'的结果会产生以下输出:

0010000010. 2014-03-14

然而,期望的\期望输出将是:

0010000010 2014-03-14

是否有像RTRIM(CHAR(column_name))这样的表达式,它将对TABLE中的所有列起作用,以获取数据作为字符串,无论列的数据类型是否为数字,varchar还是约会?

即使对场景\背景的更完整描述:

关于什么是原始表达式的输出的声明是从CHAR标量影响十进制到字符转换的意外,至少对于DB2 for i SQL,零范围压缩十进制(DECIMAL)和分区十进制(NUMERIC) )尽管可选的十进制字符作为第二个参数,但SQL数据类型表示没有小数点分隔符 [aka小数点]。同样,CHAR标量在从数字转换时省略前导零。因此,DB2 for i SQL将获得字符串select RTRIM(CHAR(PKG_AGR_IDR)), RTRIM(CHAR(STA_DTE)) from THE_SCHEMA.TEST FETCH FIRST 10 ROW ONLY的结果,而不是'10000010''0010000010.'

我认为这个问题可能特定于DB2 for Z或DB2 LUW,也许这个主题被DB2 for i错误地标记了?或许对于DB2变体之间明显的不兼容性可能会有一个[未说明的]关注点?然而,在阅读了文档之后,所描述的结果似乎与所记录的内容相反,因此我怀疑OP的实际问题可能是由于遇到了缺陷[无论是未使用的DB2版本和正在使用的版本级别]。?

我不希望有任何一个表达式能够执行NUMERIC,VARCHAR和DATE中的每一个[也不是每个INTEGER,SMALLINT,NUMERIC,DECIMAL,VARCHAR和日期]。对于小数点的省略,DB2 for i SQL可能与所需的表达方式最相似,但随后总是修剪前导零http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/db2/rbafzscachar.htm

  

...不返回前导零。返回尾随零。如果decimal-expression的小数位数为零,则不返回小数字符。 ...

对于前导零的主题,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 doc链接。

我希望解决方案需要使用CASE表达式,可能是DATA_TYPE值。这就是我编写类似的东西,虽然我只是使用VARCHAR铸造标量并且没有做任何修剪。但是我对CASE的要求不是保持前导零字符,而是主要用于选择正确的小数分隔符。并且因为 INTEGER 数字类型[sqlcode -171 aka SQL0171]不允许第二个参数十进制字符 [用于CHAR或VARCHAR],所以CASE表达式仅用于数字只使用附加到'10000010.'的以下表达式CASE WHEN DATA_TYPE IN ('INTEGER', 'SMALLINT', 'BIGINT') THEN ', ' concat DecSep concat ')' ELSE ')'来充分解析类型,其中DecSep是具有逗号或句点作为所选小数分隔符的单字符变量。然而,因为第二个参数[对于CHAR或VARCHAR]特定于第一个参数的数据类型,所以字符和日期\时间数据类型将自己的CASE表达式'VARCHAR(' concat附加到CASE WHEN DATA_TYPE IN ('DATE', 'TIME') THEN ', ' concat StdFmt concat ')' ELSE ')',其中StdFmt是具有ISO,USA,EUR或JIS的标准格式规范之一的三字符变量。

答案 1 :(得分:0)

不确定你在问什么。删除双引号?删除点? 您可以通过提供第一个和最后一个位置来执行子操作,也可以连接这两个值。

select substr(trim(PKG_AGR_IDR), 2, 11) || ' ' ||  trim(char(STA_DTE))
from test FETCH FIRST 10 ROW ONLY