0

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

以下语句有效:

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), ' '));

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

4

2 回答 2

2

您的问题是标量函数对行进行操作;LENGTH(field)仅适用于返回行的语句,例如 select 语句。要理解为什么,想象一下用其他函数代替LENGTH(). LCASE(field),例如,采用特定行中字符串的小写字母。一般应用于列是没有意义的。在某些情况下,甚至LENGTH()可以逐行改变:如果列是 type 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被定义为 aCHAR(x)而不是 a VARCHAR(x)。如果您必须使用 a 执行此操作,您可以从系统表中VARCHAR找出字段的长度。syscat.columns

编辑:添加了对 null 值的处理,因为LENGTH()如果 in 的值为 null,则可能返回fieldnull。

于 2012-09-20T11:13:10.580 回答
2

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

于 2012-09-20T17:08:29.157 回答