首页 > 解决方案 > 如何将字符放在 varchar 列的最后一个可能位置?

问题描述

我需要更新 ORACLE 中列的最后一个字节。假设我们有一个表:EMPLOYEE,其中有一列:DEPT,它的类型为 VARCHAR2(30 CHAR)。在此表中,我想用一个值(可以是任何字符)更新列 DEPT 第 30 个字符。

我尝试了以下查询:

UPDATE EMPLOYEE SET DEPT = (SUBSTR(DEPT,1,29)||'M') WHERE EMPID = 'XYZ123';

但它在发现 DEPT 值的空格不完全位于第 30 位之后将“M”连接起来。

考虑下面的例子:

Employee Table: 
    EMPID    EMPNAME     DEPT 
    -------- ----------- --------- 
    XYZ123   John        Developer 

当我运行查询时,它更新了 DEPT 列,DeveloperM而我希望它为Developer M. 'M' 值必须在最后或第 30 位更新,而不仅仅是在值结束的位置之后。

有人可以建议吗?

标签: sqloracle

解决方案


这是 varchar 字段不存储尾随空格https://docs.oracle.com/cd/A97630_01/appdev.920/a96624/b_char.htm的预期行为。所以给定

DROP TABLE T;
CREATE TABLE T(DEPT varchar2(30));
INSERT INTO T (DEPT) VALUES ('ABC');
INSERT INTO T (DEPT) VALUES ('123456789012345678901234567890');

连接米

UPDATE t SET DEPT = (SUBSTR(DEPT,1,29)||'M');

结果是

DEPT                         
------------------------------
ABCM                           
12345678901234567890123456789M 

你可以在连接之前 rpad dept

UPDATE T SET DEPT = rpad(SUBSTR(DEPT,1,29),29,' ')||'M' ;

结果是

DEPT                         
------------------------------
ABCM                         M 
12345678901234567890123456789M 

但存在存储空间成本。或者,您可以将 varchar2 更改为 char。

如果你想让 m 浮动,你可以测试 dept 长度

UPDATE t SET DEPT = 
  case when length(Dept) = 30 then (SUBSTR(DEPT,1,29)||'M')
  else (SUBSTR(DEPT,1,29)||' M')
  end;

结果

DEPT                         
------------------------------
ABC M                          
12345678901234567890123456789M 

推荐阅读