Я ищу некоторую помощь, чтобы очистить список ссылочных номеров, которые у меня есть в моей таблице. Правильный ссылочный номер состоит из 8 или 13 чисел, поэтому я изучал различные шаблоны в моей таблице данных, чтобы определить, какие ошибки мне нужно исправить. Ниже приведен пример ошибок, с которыми я сталкивался и искал совета для принятия лучших практик, а не для повторного кодирования.
Ниже приведены мои операторы создания таблицы и вставки и требуемый вывод.
Создание таблицы
CREATE TABLE “BU_REF_NO"
( "REF_NO" VARCHAR2(255 BYTE)
);
Вставка оператора
INSERT INTO "BU_REF_NO" (REF_NO) VALUES ('12 103 501');
INSERT INTO "BU_REF_NO" (REF_NO) VALUES ('10 1234 5678 901');
INSERT INTO "BU_REF_NO" (REF_NO) VALUES ('12 3456 7890 123');
INSERT INTO "BU_REF_NO" (REF_NO) VALUES ('123456 7890 123');
INSERT INTO "BU_REF_NO" (REF_NO) VALUES ('987654 3210 321');
INSERT INTO "BU_REF_NO" (REF_NO) VALUES ('12345678 1234567890123');
INSERT INTO "BU_REF_NO" (REF_NO) VALUES ('1234567890123 12345678');
INSERT INTO "BU_REF_NO" (REF_NO) VALUES ('1234567890 123');
Окончательный вывод
REF_NO
12103501
1012345678901
1234567890123
1234567890123
9876543210321
12345678 1234567890123
1234567890123 12345678
1234567890123
Мой запрос, чтобы выбрать последовательности строк, начинающиеся с цифры и после 2 символов, есть пробел.
SELECT
*
FROM
BU_REF_NO
WHERE
REF_NO REGEXP '^[0-9]{2} '
;
Это дает мне следующий вывод:
REF_NO
12 103 501
10 1234 5678 901
12 3456 7890 123
Теперь, когда я застрял, я пытаюсь найти правильный способ удалить пробелы для всех различных последовательностей, то есть 2 символа, затем пробел или 6 символов и пробел. Я пытался запустить следующий код для последовательностей, которые есть в моей таблице, но я уверен, что есть более простой способ реализовать это, поэтому я искал несколько советов.
В настоящее время у меня есть следующее (не проверено) пока):
UPDATE BU_REF_NO SET REF_NO = '' WHERE REF_NO REGEXP '^[0-9]{2} ';
UPDATE BU_REF_NO SET REF_NO = '' WHERE REF_NO REGEXP '^[0-9]{6} ';
UPDATE BU_REF_NO SET REF_NO = '' WHERE REF_NO REGEXP '^[0-9]{10} ';
Другая вещь, которую мне, вероятно, нужно включить, - это проверить общее количество значений, исключая пробелы, так как мне нужно только запустить некоторый код, когда у меня всего 8 или 13 значений, так что это, вероятно, должно быть включено в начале моего кода. И наконец, если у меня меньше 8 или больше 13 значений, REF_NO просто остается без изменений.
Заранее спасибо.
ОБНОВЛЕНИЕ:
Привет, спасибо всем за ваши ответы. Чтобы было понятно из примера данных, я показываю, какие столбцы должны быть изменены, а какие остаются неизменными (BU_REF_NO_AMENDED - это не существующий столбец, просто показывающий после кода, как он должен выглядеть):
BU_REF_NO | BU_REF_NO_AMENDED
12 103 501 | 12103501
10 1234 5678 901 | 1012345678901
12 3456 7890 123 | 1234567890123
123456 7890 123 | 1234567890123
987654 3210 321 | 9876543210321
12345678 1234567890123 | 12345678 1234567890123
1234567890123 12345678 | 1234567890123 12345678
1234567890 123 | 1234567890123
Таким образом, все строки выше в исправленном столбце удаляют пробелы (BU_REF_AMENDED), кроме 2 (12345678 1234567890123, 1234567890123 12345678). Причина этого заключается в том, что эти 2 строки имеют 8 цифр, пробел, а затем 13 цифр или 13 цифр, пробел и 8 цифр.
Причина, по которой эти 2 строки не были изменены, заключается в том, что эти строки имеют исправьте ref_numbers, и мне нужно оставить эти строки такими, как они есть.
Надеюсь, это прояснит мой окончательный вывод.
Привет, я написал следующий запрос, чтобы определить длину чисел в строках, которые я хочу, как я думал, это может помочь мне написать внутренний запрос, чтобы выбрать только те строки, для которых нужно удалить пробелы.
SELECT
REF_NO,
LENGTH(REF_NO) AS LENGTH_WITH_SPACE,
LENGTH(REF_NO) - LENGTH(REPLACE(REF_NO, ' ', '')) AS SPACES,
LENGTH(REF_NO) - (LENGTH(REF_NO) - LENGTH(REPLACE(REF_NO, ' ', ''))) AS LENGTH_WITHOUT_SPACES
FROM
BU_REF_NO
;
Это дает мне вывод:
REF_NO | LENGTH_WITH_SPACE | SPACES | LENGTH_WITHOUT_SPACES
12 103 501 | 10 | 2 | 8
10 1234 5678 901 | 16 | 3 | 13
12 3456 7890 123 | 16 | 3 | 13
123456 7890 123 | 15 | 2 | 13
987654 3210 321 | 15 | 2 | 13
12345678 1234567890123 | 22 | 1 | 21
1234567890123 12345678 | 22 | 1 | 21
1234567890 123 | 14 | 1 | 13
Теперь я думаю о написании внешнего запроса, который выберет столбец LENGTH_WITHOUT_SPACES для всех значений, равных 13, а также где пробелы больше 1 в столбце SPACES. Затем я могу выполнить запрос REGEXP REPLACE для замены пробелов.
Попробую это и опубликую свои результаты.
Вот то, что я пытался, и это работает!
SELECT
REF_NO,
CASE
WHEN LENGTH_WITHOUT_SPACES = 8 AND SPACES > 0 THEN REGEXP_REPLACE(REF_NO,' ','')
WHEN LENGTH_WITHOUT_SPACES = 13 AND SPACES > 0 THEN REGEXP_REPLACE(REF_NO,' ','')
ELSE REF_NO
END AS REF_AMENDED
FROM
(
SELECT
REF_NO,
LENGTH(REF_NO) AS LENGTH_WITH_SPACE,
LENGTH(REF_NO) - LENGTH(REPLACE(REF_NO, ' ', '')) AS SPACES,
LENGTH(REF_NO) - (LENGTH(REF_NO) - LENGTH(REPLACE(REF_NO, ' ', ''))) AS LENGTH_WITHOUT_SPACES
FROM
BU_REF_NO
;
Просто нужно обновить это существующий столбец, но получить его.