为了更好地描述场景,人们可能会认为 OP 可能写得更像以下内容:
将包括一些关于正在做的事情的背景,这样以后的引用 [例如对 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') 填充该 TABLE,所需的是获得一个结果集 [仅限于前十行以进行测试],它将将 [THE_SCHEMA 中名为 TABLE 的 TABLE 的] 每一列的数据包含为 VARCHAR 数据,由以下查询生成,该查询将由存储在 SYSCOLUMNS 目录 VIEW 中的元数据生成:
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)) 这样的表达式,它将对 TABLE 中的所有列起作用,以获取字符串形式的数据,无论列的数据类型如何,无论它们是数字还是 varchar还是日期?
即使有了更完整的场景描述\背景:
关于原始表达式的输出是什么的声明对于影响十进制到字符转换的 CHAR 标量是出乎意料的,至少对于 DB2 for i SQL 而言,其零刻度压缩十进制 (DECIMAL) 和分区十进制 (NUMERIC ) SQL 数据类型表示没有小数分隔符 [又名小数点] 尽管可选的 decimal-character 作为第二个参数。同样,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和日期]。由于省略了小数点,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 的要求不是保持前导零字符,而是主要用于选择正确的十进制分隔符。并且因为第二个参数 decimal-character [for CHAR or VARCHAR] 对于 INTEGER 数字类型 [sqlcode -171 aka SQL0171] 是不允许的,因此 CASE 表达式仅用于数字仅使用附加到'VARCHAR(' concat 的以下表达式CASE WHEN DATA_TYPE IN ('INTEGER', 'SMALLINT', 'BIGINT') THEN ', ' concat DecSep concat ')' ELSE ')' 就可以充分解析类型,其中DecSep 是一个字符变量,其以逗号或句点作为所选的小数分隔符。然而,由于第二个参数 [对于 CHAR 或 VARCHAR] 特定于第一个参数的数据类型,因此字符和日期\时间数据类型有自己的 CASE 表达式 CASE WHEN DATA_TYPE IN ('DATE', 'TIME') THEN ', ' concat StdFmt concat ')' ELSE ')' 附加到 'VARCHAR(' concat ,其中 StdFmt 是三个-具有 ISO、USA、EUR 或 JIS 的标准格式规范之一的字符变量。