具有字段长度的DB2右填充
我们有不同长度的字段,并希望用空格将其右键填充到模式中定义的字段长度 以下声明正在发挥作用:具有字段长度的DB2右填充,db2,Db2,我们有不同长度的字段,并希望用空格将其右键填充到模式中定义的字段长度 以下声明正在发挥作用: SELECT RPAD(field, LENGTH(field), ' ') AS field FROM schema.table; 这会产生SQL错误206,其中SQLState 42703:在使用它的上下文中无效 // Our application resolves the prepared statement's ? - this is working fine INSERT INTO sch
SELECT RPAD(field, LENGTH(field), ' ') AS field FROM schema.table;
这会产生SQL错误206,其中SQLState 42703:在使用它的上下文中无效
// 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), ' '));
是否有可能避免硬编码字段长度?您的问题是标量函数对行进行操作<代码>长度(字段)仅在返回行的语句(如select语句)中起作用。要了解原因,请想象一下用其他函数代替
LENGTH()
<例如,code>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, ' '));
请注意,此解决方案取决于字段
被定义为CHAR(x)
而不是VARCHAR(x)
。如果必须使用VARCHAR
执行此操作,则可以从syscat.columns
系统表中找到字段的长度
编辑:添加了空值处理,因为如果
字段中的值为空,则LENGTH()
可能返回空值。您的问题是标量函数对行进行操作<代码>长度(字段)
仅在返回行的语句(如select语句)中起作用。要了解原因,请想象一下用其他函数代替LENGTH()
<例如,code>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, ' '));
请注意,此解决方案取决于字段
被定义为CHAR(x)
而不是VARCHAR(x)
。如果必须使用VARCHAR
执行此操作,则可以从syscat.columns
系统表中找到字段的长度
编辑:添加了对空值的处理,因为如果
字段中的值为空,则LENGTH()
可能返回空值。如果需要固定长度的列,为什么要使用VARCHAR
?使用CHAR
-DB2将自动为您填充值。如果您想要固定长度的列,为什么要使用VARCHAR
?使用CHAR
-DB2将自动为您填充值。多个Cobol和主机(通过一些复制)应用程序使用该数据库。它确实应该是CHAR
,但我们不能因为担心新问题而更改数据库中的任何内容……多个Cobol和主机(通过一些复制)应用程序使用该数据库。它确实应该是CHAR
,但我们不能因为担心新问题而更改数据库中的任何内容……感谢您的精彩回答!是的,我们使用的是VARCHAR
(没有充分的理由)…谢谢你的回答!是的,我们正在使用VARCHAR
(没有充分的理由)。。。