DB2右边填充字段长度

时间:2012-09-20 10:27:11

标签: db2

我们有不同长度的字段,并希望用空格右键填充模式中定义的字段长度。

以下声明正在发挥作用:

SELECT RPAD(field, LENGTH(field), ' ') AS field FROM schema.table;

这会产生带有SQLState 42703的SQL错误206:在使用它的上下文中无效。

// Our application resolves the prepared statement's ? - this is working fine
INSERT INTO schema.table (field) VALUES (RPAD(?, LENGTH(field), ' '));

同样的情况发生在:

INSERT INTO schema.table (field) VALUES (RPAD(?, LENGTH(schema.table.field), ' '));

是否有可能避免对字段长度进行硬编码?

2 个答案:

答案 0 :(得分:2)

你的问题是标量函数在行上运行; LENGTH(field)仅适用于返回行的语句,例如select语句。要理解为什么,想象一下其他函数代替LENGTH()。例如,LCASE(field)采用特定行中字符串的小写字母。一般地应用于列是没有意义的。在某些情况下,即使LENGTH()也可能逐行变化:如果列的类型为VARCHAR,则LENGTH()会返回实际字符​​串的长度。

解决方案是选择任何行,对字段执行LENGTH()操作,并将结果存储在变量中:

CREATE OR REPLACE VARIABLE field_length INTEGER;
SET field_length = (
    SELECT LENGTH(field) FROM schema.table 
        WHERE field IS NOT NULL
        FETCH FIRST ROW ONLY
);

您只需在代码中执行一次此操作。然后,每当你需要使用长度时:

INSERT INTO schema.table (field) VALUES (RPAD(?, field_length, ' '));

请注意,此解决方案取决于field被定义为CHAR(x)而不是VARCHAR(x)。如果必须使用VARCHAR执行此操作,则可以从syscat.columns系统表中找到字段的长度。

编辑:添加了空值的处理,因为如果LENGTH()中的值为空,field可能会返回null。

答案 1 :(得分:2)

如果您需要固定长度的列,为什么使用VARCHAR?使用CHAR - DB2将自动为您填充值。