具有字段长度的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
(没有充分的理由)。。。