2013-06-17 4 views
3

Я читал mysql documentation about regexp, но выглядит как regexp может использоваться только как WHERE фильтры для соответствия строкам в запросе SELECT.Mysql: using regexp соответствует полям?

Im интересно, если можно извлечь матчи регулярного выражения в виде столбцов, например, если в моей таблице у меня есть текстовое поле SKU с:

+----------------+--------------+---------------+ 
|sku    | product_name | [other fields]| 
+----------------+--------------+---------------+ 
|ART-2830--107-70| Foo   |    | 
|ART-2832--115-6 | Bar   |    | 
+----------------+--------------+---------------+ 

было бы здорово, чтобы огонь выберите запрос, который соответствует регулярное выражение (ART-)([0-9]+)(--)([0-9]+)(-)([0-9]+), что дает мне выход:

+------+------------+-------+----------+ 
| type | collection | model | material | 
+------+------------+-------+----------+ 
| ART | 2830  | 107 | 70  | 
| ART | 2832  | 115 | 6  | 
+------+------------+-------+----------+ 

Пожалуйста, обратите внимание, что type, collection, model and material колонны нет в моей таблице, и являются лишь матчи выше регулярного выражения.

Возможно ли это?

p.s: Я знаю, что бы быть хорошей идеей, чтобы нормализовать эту таблицу, добавив столбец для каждого собственности мне нужно, но это структура я должен работать и я не могу изменить это в данный момент.

EDIT На всякий случай кому-то это нужно, я увидел это PostgreSql offer this function.

ответ

4

Ответ «нет» в целом - по крайней мере, не без большого кодирования грубой силы. Но, вам повезло, потому что вы можете делать то, что вы хотите «легко» в MySQL:

select substring_index(sku, '-', 1) as type, 
     reverse(substring_index(reverse(substring_index(sku, '-', 2)), '-', 1)) as collection, 
     reverse(substring_index(reverse(substring_index(sku, '-', 4)), '-', 1)) as model, 
     reverse(substring_index(reverse(substring_index(sku, '-', 5)), '-', 1)) as material 
from skus 

Хорошо, возможно, не самый очевидный набор функций.Но вот то, что он делает для модели:

Пуск с: ART-2830--107-70

substring_index(sku, '-', 4) --> ART-2830--107 

reverse():

701--0381-TRA

Внешняя substring_index(. . . 1):

701 

И окончательный reverse():

107 
+1

Так грустно, что это единственный способ. На данный момент гораздо лучше захватить данные из db, используя регулярное выражение, чтобы соответствовать строкам, а затем обрабатывать серверный сервер результатов. Если бы я мог создать другую таблицу для нормализации данных. – Strae

+0

Postgresql предлагает эту функцию, я обновляю свой ответ – Strae

0

Использование regex в выражении select действительно зависит от языка sql. Для MySql вы можете прочитать еще немного об этом в руководстве.

В этом разделе руководства говорится об использовании оператора выбора регулярного выражения: http://dev.mysql.com/doc/refman/5.7/en/regexp.html. Эта страница руководства также имеет следующую ссылку на примеры использования операторов regex для операторов.

http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

Этот пример также в руководстве.

To find names containing a “w”, use this query: 

mysql> SELECT * FROM pet WHERE name REGEXP 'w'; 
+----------+-------+---------+------+------------+------------+ 
| name     | owner | species | sex  | birth      | death      | 
+----------+-------+---------+------+------------+------------+ 
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       | 
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 | 
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       | 
+----------+-------+---------+------+------------+------------+ 

вы можете вернуть данные на основе регулярных выражений группы захвата?

№. Оператор where фильтрует данные, возвращаемые механизмом SQL. Вам нужно будет создать запись для каждого столбца данных, который вы хотите вернуть. Как и в ответе Гордона Линоффа, каждый столбец может обрабатываться SQL, чтобы вручную извлекать данные из данного столбца. Но это решение далека от розового идеала использования регулярного выражения для описания оператора выбора sql.

Я собираюсь использовать группы захвата regex для извлечения данных, тогда это нужно будет сделать после получения данных.

+0

Первая строка моего вопроса сказать _I прочитать MySQL документации о регулярных выражениях, но выглядит как регулярное выражение может быть использован в качестве WHERE фильтров для соответствия строк в SELECT, query._ ли вы пропустить эту часть? – Strae

+0

Обновлен ответ, чтобы показать, где именно в руководстве MySql говорится о том, как использовать regexp в качестве WHERE-фильтров для соответствия строкам в запросе SELECT. –

+0

Прошу прощения, я не хочу выглядеть грубым, но если вы прочтете мой вопрос, вы увидите, что ваш ответ не связан .. im не спрашивает, как использовать regexp в mysql_, но ** как использовать совпадения регулярного выражения как столбцы ** Я думаю, это недоразумение;) Позвольте мне уточнить мой вопрос, чтобы уточнить это. – Strae

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