sql - 如何将字符放在 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 位更新,而不仅仅是在值结束的位置之后。
有人可以建议吗?
解决方案
这是 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
推荐阅读
- c++ - 为什么`iota(0) | take(0)` 不是 C++20 中的模型范围::sized_range?
- single-sign-on - 如何在单点登录 (SSO) 中处理令牌到期?
- android - 如何检查手机号码是否存在于同一用户的android设备中?
- ssl - System.Net.WebException:下载[URL]时出错底层连接已关闭:发送时发生意外错误
- nginx - 选择性地允许其他网站 iframe 我的网站
- python - Python复制目录并将xls更改为xlsx
- r - 安装包“Rhtslib”时出错
- sql - ORA-01780: oracle 中需要字符串文字
- odata - 无法在空手道中指定 Odata URL
- c# - 在c#中对嵌套属性使用JsonConvert.DeserializeObject()方法