mysql regex получава позицията на съвпадащия първи буквен знак

Имам mysql заявка с REGEXP, която съвпада с началото на полето с „A“, „An“ и „The“, последвано от интервал, ако съвпадне, след това изрязвам полето от началото на първия интервал, след което съпоставям началото на полето със специален символ като (','',[:space:]) ако да, тогава изрежете всички водещи специални символи. Mysql заявката е с CASE така:

CASE
  WHEN field_data_field_display_title_field_display_title_value REGEXP '(^(A|An|The)[[:space:]])' = 1 THEN
  TRIM(SUBSTR(field_data_field_display_title_field_display_title_value , INSTR(field_data_field_display_title_field_display_title_value ,' ')))
  WHEN field_data_field_display_title_field_display_title_value REGEXP '(^[\"\'[:space:]])' = 1 THEN
    TRIM(SUBSTR(field_data_field_display_title_field_display_title_value ,2))
  ELSE field_data_field_display_title_field_display_title_value
END

Не мога да отрежа всички водещи специални символи, докато мога да отрежа първия водещ специален знак, като предам '2' във функцията SUBSTR. Тъй като mysql не поддържа група за улавяне, така че не мога да получа съвпадащата стойност в уловената група.

Така че въпросът ми е как мога да получа позицията на първия буквен знак в полето с mysql заявка, така че да мога да предам тази позиция във функцията SUBSTR, за да отрежа всички водещи специални символи. Опитах с [:alpha:] клас като:

TRIM(SUBSTR(field_data_field_display_title_field_display_title_value ,
 INSTR(field_data_field_display_title_field_display_title_value ,[:alpha:])))

но дава грешка в синтаксиса на mysql. Или някой може да ми предложи някакъв друг подход за изрязване на всички водещи специални знаци.

Благодаря предварително!


person MutantMahesh    schedule 20.07.2014    source източник
comment
Вижте Как да направите замяна на регулярен израз в MySQL?   -  person Bill Karwin    schedule 20.07.2014
comment
Или много други подобни въпроси: stackoverflow.com/   -  person Bill Karwin    schedule 20.07.2014
comment
Първата връзка, която предоставихте, предлага използването на някаква mysql библиотека, но нямам разрешение да инсталирам библиотека на сървъра.   -  person MutantMahesh    schedule 20.07.2014


Отговори (2)


Използвах въпросния фрагмент на mysql, който публикувах в клаузата ORDER BY, за да сортирам данните. Тъй като имах малък списък със съвпадения, които искам да премахна, последвах предложението на @BillKarwin. Клаузата ORDER BY в заявката става нещо подобно

ORDER BY 
  CASE
    WHEN field_data_field_display_title_field_display_title_value REGEXP '^(A|An|The)[[:space:]]' = 1 THEN
      TRIM(SUBSTR(field_data_field_display_title_field_display_title_value , INSTR(field_data_field_display_title_field_display_title_value ,' ')))
    WHEN field_data_field_display_title_field_display_title_value REGEXP '^[\']' = 1 THEN
      TRIM(LEADING '\'' FROM field_data_field_display_title_field_display_title_value)
    WHEN field_data_field_display_title_field_display_title_value REGEXP '^[[:space:]]' = 1 THEN
      TRIM(LEADING ' ' FROM field_data_field_display_title_field_display_title_value)
    WHEN field_data_field_display_title_field_display_title_value REGEXP '^[\"]' = 1 THEN
      TRIM(LEADING '"' FROM field_data_field_display_title_field_display_title_value)
    ELSE field_data_field_display_title_field_display_title_value
  END ASC
person MutantMahesh    schedule 21.07.2014

Няма функция за съпоставяне на regexp, която отчита позицията в низа, нито има функция за замяна на regexp в MySQL.

(Актуализация: MySQL 8.0 вече поддържа повече регулярни функции, но те не са налични в по-ранни версии на MySQL.)

Ако знаете, че търсите кратък списък от конкретни думи, можете да изберете най-ниската позиция сред няколко съвпадения:

SUBSTRING(field_data_field_display_title_field_display_title_value,
  LEAST(
    INSTR(field_data_field_display_title_field_display_title_value, 'A '),
    INSTR(field_data_field_display_title_field_display_title_value, 'An '),
    INSTR(field_data_field_display_title_field_display_title_value, 'The ')
  )
)

Обикновено е неудобно да се правят съвпадения на поднизове или замествания в SQL, тъй като SQL основно е проектиран да третира колона като нередуцируема част от данни. Всички функции за работа с поднизове са разширения на езика, а не нещо вградено.

Ако искате по-добро боравене с низови функции, би било по-лесно да извлечете целия низ в приложение и да напишете код, като използвате по-богат набор от функции. Въпреки че разбирам, че това не е практично, ако причината за манипулацията на подниза, която описвате, е за изрази, които засягат резултатите от заявката, като клаузата WHERE за ограничаване на редове или в клаузата ORDER BY за сортиране.

Ако е така, тогава по-доброто решение е да промените начина, по който съхранявате низове. Разделете низовете в префиксна част със специалните знаци, след това отделна колона за частта, започваща с A, An или The, и след това може би дори трета колона с текст в края, който не искате да бъде част от основен текст.

Предимството на разделянето му е, че SQL изразите за работа с главния низ са много по-прости и дори можете да го индексирате нормално, за да постигнете голяма производителност за определени заявки.

person Bill Karwin    schedule 21.07.2014
comment
Благодаря @BillKarwin. Да, направих нещо подобно на това. публикуване на моя отговор в полето за отговор. - person MutantMahesh; 21.07.2014