2015-03-22 4 views
2

Я ищу способ запуска SQL-запроса определенного шаблона в строке с помощью регулярных выражений. Строка состоит из буквы A в начале, затем 3 случайных символа, за которыми следуют пары символов «AB», «CD» или «EF». (Это не может быть "BA", "DC" ...)SQL регулярные выражения смежных символов в строке

Примеры успешных запросов:

AfGhAB

AtttCD

Неудачные запросы:

AtreBA

AdrtFC

Thanks, Orna.

+0

Какие dbms? (К сожалению, regexp реализуется многими способами.) – jarlh

+0

Часть, в которой вы указываете, что шаблон должен соответствовать 'AB', тогда' CD' и т. Д. Не является задачей регулярного выражения tho. Это распространенная ошибка, которую люди хотят исправить слишком много с помощью RegEx. Я хотел бы, чтобы конечная часть просто соответствовала свободно, а затем отрубала остальную часть кодом. '^ А \ ш {3} [A-Z] {2}'. Вы можете добавить безумную строку правил «OR» с RegEx на последней части, но это кажется довольно бесполезным и, скорее всего, сделает ваш запрос безумно медленным, так как RegEx ищет буквально каждую запись в таблице, которая должна быть проверена. –

+0

Вы можете сделать что-то безумное: '^ A. {3} (?: AB | CD | EF | GH | IJ | KL | MN | OP | QR | ST | UV | WX | YZ) $' Удачи вам что: P –

ответ

0

Простой способ получить то, что вы хотите, но без использования регулярных выражений:

select columns 
from tablename 
where columnname like 'A%' 
    and substring(columnname from 5 for 2) in ('AB','CD','EF') 

SUBSTRING (ANSI SQL) иногда называют SUBSTR т.д.

будет, вероятно, выполнить гораздо быстрее.

+0

Скорее всего, это будет немного «быстрее», чем RegEx, но это все равно приводит к удару каждой записи в таблице. Если вы проверите эти запросы, даже с помощью BTREE, движок MySQL не сможет понять, чтобы пройти через «A'-узел и пропустить все остальное. Грустно, что большинство движков SQL на самом деле не очень умны на этих фронтах. Мне нравится этот ответ больше, чем решение RegEx tho :) –

+0

Когда я это написал, MySQL не был указан. – jarlh

+0

По крайней мере, для MySQL и Postgres. Я знаю, что добавленный вами оператор 'AND' будет игнорировать' INDEX'' BTREE'. Это действительно странно, почему это происходит, но это, по-видимому, недостаток, когда они только что сделали компромисс, что 1 LIKE-оператор вызовет INDEXING, но при добавлении большей сложности он просто снизит его внутреннюю оптимизацию. –

Смежные вопросы