2015-10-01 5 views
0

У меня есть огромная база данных заполнены научными названия, которые выглядят следующим образом:Зачистки Скобки (и содержания) из URL,

Canis lupus 
Homo sapiens 

Я заменяющее пространство с тиром, чтобы преобразовать их в URL, ...

Canis-lupus 
Homo-sapiens 

Но есть много научных названий, которые выглядят следующим образом:

Panthera (Felis) leo 
Allactaga (Allactaga) vinogradovi 

Может кто-нибудь предложить лучший метод для зачистки 1) круглые скобки, 2) содержание в скобках, и 3) любые пробелы до или после скобок с тире, так что результат выглядит следующим образом ?:

Panthera-leo 

Я используя PHP и MySQL.

+2

что-то не так с 'UrlEncode()'? –

+1

Url encode - это php-функция, которая делает это за вас, я нахожусь на своем телефоне на банке, поэтому мне действительно не хочется отвечать, так вот страница функций php, она очень проста в использовании http://php.net /manual/en/function.urlencode.php – Jesse

+0

Вы хотите просто заменить это в результатах SELECT или ОБНОВИТЬ данные непосредственно в таблице? Если вы можете положиться на наличие только одного набора скобок max, это выполнимо в запросе; в противном случае вам лучше использовать язык программирования. – Uueerdo

ответ

1

Это следует сделать это:

SELECT CONCAT(LEFT([field], INSTR([field], '(')-1) 
       , '-' 
       , SUBSTR([field], INSTR([field], ')')+1) 
     ) AS innerTrimmedField 
FROM [table] 
WHERE [field] LIKE '%(%)%' 
; 

Обратите внимание, что вам все равно придется иметь дело с пробелами. Если в скобках были пробелы до и/или после них, все они теперь будут смежными друг с другом; так что вам придется иметь дело с этим, если вы не возражаете Panthera (Felis) leo становится Panthera---leo.

Если вам нужен список всех записей, вы можете использовать UNION с помощью не скобок (используя для этого WHERE [field] NOT LIKE '%(%)%'). Если вы сделали то, что UNION запросить подзапрос, вы можете получить внешний запрос на замену пространства для всех сразу.

Но это, вероятно, будет быстрее и немного более гибким:

SELECT REPLACE(
     IF([field] LIKE '%(%)%' 
      , CONCAT(LEFT([field], INSTR([field], '(')-1) 
        , '-' 
        , SUBSTR([field], INSTR([field], ')')+1) 
        ) 
      , [field] 
     ) 
     , ' ', '-') AS normalizedStrings 
FROM [table] 
WHERE [standard filter conditions you might want] 
; 
Смежные вопросы