为VARCHAR列值添加空间以确保最小长度为2

时间:2019-05-20 11:01:41

标签: sql oracle

我有一个表TEST_TABLE,该表的列名为LNAME,数据类型为VARCHAR2。 要求是LNAME的值必须至少为2个字符。

1-创建表格

CREATE TABLE TEST_TABLE
(
  LNAME VARCHAR2(4000)
);

2-插入长度为1的记录

INSERT INTO TEST_TABLE (LNAME) VALUES ('A');

LNAME的值为'A'。 我需要将此值转换为'A '。 [增加空间以确保满足最小长度条件]。

注意:需要使用CASE ... WHEN

完成

我的尝试

select
CASE
WHEN LENGTH(LNAME) < 2
THEN RPAD(LNAME,2)
ELSE ''
END LNAME
from TEST_TABLE;

使用以下查询检查长度:

select LENGTH(LNAME) from TEST_TABLE;

长度返回1,而不是预期的2。 RPAD是将空格附加到“ A”末尾的正确方法吗?

2 个答案:

答案 0 :(得分:2)

rpad()应该可以,但是您的else可能会引起问题:

select (case when length(lname) < 2 then rpad(lname, 2)
             else lname
        end) as lname
from TEST_TABLE;

答案 1 :(得分:0)

在列上使用CHECK约束:

CREATE TABLE TEST_TABLE
(
  LNAME VARCHAR2(4000) CONSTRAINT TEST_TABLE__LNAME__MINLENGTH2 CHECK ( LENGTH( LNAME ) >= 2 )
);

然后,如果值太短,则可以在插入语句中使用RPAD

INSERT INTO TEST_TABLE ( LNAME ) VALUES ( RPAD( 'A', 2 ) );

或者您可以使用MERGE语句:

MERGE INTO TEST_TABLE t
USING ( SELECT 'A' AS value FROM DUAL ) v
ON ( 0 = 1 )
WHEN NOT MATCHED THEN
  INSERT ( LNAME ) VALUES ( CASE WHEN LENGTH( v.value ) < 2 THEN RPAD( v.value, 2 ) ELSE v.value END );

或匿名PL / SQL块:

DECLARE
  value TEST_TABLE.LNAME%TYPE := 'B';
BEGIN
  INSERT INTO test_table ( lname ) VALUES ( CASE WHEN LENGTH( value ) < 2 THEN RPAD( value, 2 ) ELSE value END );
END;
/

db <>提琴here

如果要更改现有数据,请使用UPDATE语句:

UPDATE test_table
SET    lname = RPAD( lname, 2 )
WHERE  LENGTH( lname ) < 2