我们有不同长度的字段,并希望用空格右键填充模式中定义的字段长度。
以下声明正在发挥作用:
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), ' '));
是否有可能避免对字段长度进行硬编码?
答案 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将自动为您填充值。