Чтобы добавить пространство к значению столбца VARCHAR, чтобы обеспечить минимальную длину 2 - PullRequest
0 голосов
/ 20 мая 2019

У меня есть таблица 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 ... КОГДА

Моя попытка:

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 правильным способом добавить пробел к концу буквы «А»?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

rpad() должно работать, но ваш else может вызывать проблемы:

select (case when length(lname) < 2 then rpad(lname, 2)
             else lname
        end) as lname
from TEST_TABLE;
0 голосов
/ 20 мая 2019

Используйте ограничение 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 <> fiddle здесь

Если вы хотите изменить существующие данные, используйте оператор UPDATE:

UPDATE test_table
SET    lname = RPAD( lname, 2 )
WHERE  LENGTH( lname ) < 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...