Выберите только буквы, за которыми следует число - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь выбрать несколько кодов из таблицы PostgreSQl.Мне нужны только коды с цифрами, например

GD123 
GD564

Я не хочу выбирать такие коды, как `GDTG GDCNB

Вот мой запрос:

select regexp_matches(no_, '[a-zA-Z0-9]*$')
from myschema.mytable

, что, конечно, не работает.Любая помощь приветствуется.

Ответы [ 5 ]

0 голосов
/ 17 мая 2018

Это захватывает каждую цифру и букву перед цифрами:

([A-z]+\d+)
0 голосов
/ 17 мая 2018

Шаблон для совпадения со строкой, состоящей как минимум из 1 буквы, за которой следует хотя бы 1 цифра, равен '[A-Za-z]+[0-9]+'.

Теперь, если действительные шаблоны должны были начинаться с двух букв, а затем иметь 3 цифры после того, как ваши примеры показывают, тогда замените + на {2} & {4} соответственно и заключите шаблонв ^$, например: '^[A-Za-z]{2}[0-9]{3}$'

Оператор соответствия регулярному выражению - ~, который можно использовать в предложении where:

SELECT no_
FROM myschema.mytable
WHERE no_ ~ '[A-Za-z]+[0-9]+'
0 голосов
/ 17 мая 2018

Вы можете использовать

CREATE TABLE tb1
    (s character varying)
;

INSERT INTO tb1
    (s)
VALUES
    ('GD123'),
    ('12345'),
    ('GDFGH')
;

SELECT * FROM tb1 WHERE s ~ '^(?![A-Za-z]+$)[a-zA-Z0-9]+$';

Результат:

enter image description here

информация

  • ^ - начало строки
  • (?![A-Za-z]+$) - отрицательный прогноз, который не соответствует, если в конце строки есть только буквы
  • [a-zA-Z0-9]+ - 1 или более буквенно-цифровых символов
  • $ - конец строки.

Если вы хотите избежать совпадения 12345, используйте

'^(?![A-Za-z]+$)(?![0-9]+$)[a-zA-Z0-9]+$'

Здесь (?![0-9]+$) аналогичным образом потерпит совпадение, если с начала строки все символы до конца строки будут цифрами. Результат:

enter image description here

0 голосов
/ 17 мая 2018

Если формат данных, которые вы хотите получить, представляет собой набор символов с набором цифр (например, GD123), вы можете использовать регулярное выражение:

         [a-zA-Z0-9]+[0-9]
0 голосов
/ 17 мая 2018

что-то вроде:

so=# with c(v) as (values('GD123'),('12345'),('GD ERT'))
select v ~ '[A-Z]{1,}[0-9]+', v from c;
 ?column? |   v
----------+--------
 t        | GD123
 f        | 12345
 f        | GD ERT
(3 rows)

? .. * * 1004

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