Как исправить набор значений в столбце с помощью REGEXP, удалив пробелы в MySQL? - PullRequest
0 голосов
/ 07 февраля 2020

Я ищу некоторую помощь, чтобы очистить список ссылочных номеров, которые у меня есть в моей таблице. Правильный ссылочный номер состоит из 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
;

Просто нужно обновить это существующий столбец, но получить его.

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

достаточно выражения "^ [0-9] +" без квантификатора

1 голос
/ 08 февраля 2020

Посмотрите, достаточно ли простой замены, ваш пример имеет недостатки.

CREATE TABLE BU_REF_NO 
   (           END_DATE VARCHAR(255)
   );
INSERT INTO BU_REF_NO (END_DATE) VALUES ('12 103 501');
INSERT INTO BU_REF_NO (END_DATE) VALUES ('10 1234 5678 901');
INSERT INTO BU_REF_NO (END_DATE) VALUES ('12 3456 7890 123');
INSERT INTO BU_REF_NO (END_DATE) VALUES ('123456 7890 123');
INSERT INTO BU_REF_NO (END_DATE) VALUES ('987654 3210 321');
INSERT INTO BU_REF_NO (END_DATE) VALUES ('12345678 1234567890123');
INSERT INTO BU_REF_NO (END_DATE) VALUES ('1234567890123 12345678');
INSERT INTO BU_REF_NO (END_DATE) VALUES ('1234567890 123');
✓

✓

✓

✓

✓

✓

✓

✓
UPDATE BU_REF_NO SET END_DATE = REPLACE(END_DATE,' ','');
SELECT * FROM BU_REF_NO;
| END_DATE              |
| :-------------------- |
| 12103501              |
| 1012345678901         |
| 1234567890123         |
| 1234567890123         |
| 9876543210321         |
| 123456781234567890123 |
| 123456789012312345678 |
| 1234567890123         |

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...