0
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)) 是否有任何函数组合,我可以使用这些函数为两个字段获得正确的输出。

4

2 回答 2

1

有人可能会认为 OP 可能写得更像下面这样,以更好地描述场景:

将包括一些关于正在做的事情的背景,这样以后的引用 [例如对 field_name] 的引用将被预先解释,而不必由审阅者凭直觉。

目的是启用动态生成 SQL SELECT 语句,该语句将从指定 TABLE 的列中检索数据的字符表示。给定 DDLcreate table THE_SCHEMA.TEST ( PKG_AGR_IDR NUMERIC(10, 0), STA_DTE DATE )并给定以下 DML 用于使用 sample-row 填充该 TABLE ,insert into THE_SCHEMA.TEST VALUES(10000010. '2014-03-14')所需的是获得一个结果集[限于前十行以进行测试],其中包括来自每一列的数据[THE_SCHEMA 中名为 TEST 的 TABLE] 作为 VARCHAR 数据,由以下查询生成,该查询将由存储在 SYSCOLUMNS 目录视图中的元数据生成:
select rtrim(char(PKG_AGR_IDR)),rtrim(char(STA_DTE))
from test
FETCH FIRST 10 ROW ONLY

从 SYSCOLUMNS 数据生成的单个表达式(如'RTRIM(CHAR(' CONCAT COLUMN_NAME CONCAT '))'在前面提到的查询中两次看到的那样)在应用于列名时似乎无法提供理想的结果,而与该字符表达式格式化的 COLUMN_NAME 的 DATA_TYPE 值无关。具体来说,例如,动态生成的查询的结果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)) 这样的表达式可以对表中的所有列起作用,以获取字符串形式的数据,而不管列的数据类型是数字、varchar 还是日期?

然而,即使对场景\背景进行了更完整的描述:

关于原始表达式的输出是什么的声明对于影响十进制到字符转换的 CHAR 标量是出乎意料的,至少对于 DB2 for i SQL 而言,其零刻度压缩十进制 (DECIMAL) 和分区十进制 (NUMERIC) SQL 数据尽管可选的小数字符作为第二个参数,但类型表示时没有小数分隔符[aka 小数点] 。同样,CHAR 标量在从数字转换时省略前导零。因此,DB2 for i SQL 将获得字符串的结果,而不是其中一个或'10000010''0010000010.''10000010.'

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

我不希望有任何一个表达式可以执行 NUMERIC、VARCHAR 和 DATE [也不是 INTEGER、SMALLINT、NUMERIC、DECIMAL、VARCHAR 和 DATE] 所需的任何表达式。由于省略了小数点,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 文档链接。

我希望解决方案需要使用 CASE 表达式,也许是 DATA_TYPE 值。这就是我编写类似代码的方式,尽管我只是使用了 VARCHAR 转换标量并且没有进行任何修剪。然而,我对 CASE 的要求不是保持前导零字符,而是主要用于选择正确的十进制分隔符。并且由于INTEGER数字类型 [sqlcode -171 aka SQL0171]不允许使用第二个参数十进制字符[for CHAR 或 VARCHAR] ,因此仅使用以下附加到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、USA、EUR 或 JIS 的标准格式规范。

于 2015-04-30T18:01:54.700 回答
0

不知道你在问什么。去掉双引号?删除点?您可以通过提供第一个和最后一个位置来执行 substr,也可以连接这两个值。

select substr(trim(PKG_AGR_IDR), 2, 11) || ' ' ||  trim(char(STA_DTE))
from test FETCH FIRST 10 ROW ONLY
于 2014-07-16T12:16:29.720 回答