2016-07-20 3 views
0

Я хочу извлечь почтовый индекс из строки. Поэтому, естественно, я думал, что-то вроде этого:Подстрока Mysql с использованием instr()

substring(PERSON_ADDRESS, instr(PERSON_ADDRESS,'[0-9][0-9][0-9][0-9][0-9]'), 5)

Увы, похоже, что instr(str, '[0-9]) не что-то действительно в MySQL (возвращает 0)

Любая идея о том, как это сделать?

Большое спасибо!

+1

Я не думаю, что 'INSTR' поддерживает регулярное выражение. Можете ли вы показать пример, который вы пытаетесь извлечь? –

+0

Если вы покажете нам пример PERSON_ADDRESS, кто-то покажет вам, как сделать извлечение – RiggsFolly

+0

Хотя моя первая мысль заключалась в том, что вы сделали базовую ошибку в своем проекте базы данных, _Why является zipcode не в своем собственном столбце_ – RiggsFolly

ответ

1

Вы создаете определенный пользователь функцию - до тех пор, как потенциальный почтовый индекс обнесен пространством или в последних лексемах положения это должно работать

drop function if exists tokens; 
delimiter // 
create  function tokens(instring varchar(255)) 
returns varchar(255) 
begin 
declare tempstring varchar(100); 
declare outstring varchar(100); 
declare checkit int; 
set tempstring = ltrim(rtrim(instring)); 
set checkit = 0; 
looper: while tempstring is not null and instr(tempstring,' ') > 0 do 
     set outstring = substr(tempstring,1,instr(tempstring, ' ') - 1); 
     set tempstring = ltrim(rtrim(replace(tempstring,outstring,''))); 
     if length(outstring) = 5 then 
      if substring(outstring,1,1) between char(48) and char(57) and 
       substring(outstring,2,1) between char(48) and char(57) and 
       substring(outstring,3,1) between char(48) and char(57) and 
       substring(outstring,4,1) between char(48) and char(57) and 
       substring(outstring,5,1) between char(48) and char(57) then 
       set checkit = 1; 
       leave looper; 
      end if; 
     end if; 
end while; 
if checkit = 0 then 
    set outstring = tempstring; 
      if length(outstring) = 5 then 
      if substring(outstring,1,1) between char(48) and char(57) and 
       substring(outstring,2,1) between char(48) and char(57) and 
       substring(outstring,3,1) between char(48) and char(57) and 
       substring(outstring,4,1) between char(48) and char(57) and 
       substring(outstring,5,1) between char(48) and char(57) then 
       set checkit = 1; 
      end if; 
     end if; 
end if; 

if checkit = 0 then set outstring = 'NotFound'; end if; 
return outstring; 
end // 
delimiter ; 

и с учетом этого

+------+---------------------+ 
| id | address    | 
+------+---------------------+ 
| 1 | 13 mont 12c45 st | 
| 2 | 13 mont 12345 st | 
| 3 | 13 mont 12c45 45678 | 
| 4 | 56789 mont 12c45 st | 
+------+---------------------+ 

Функцией возвращает это

+------+---------------------+----------+ 
| id | address    | zipcode | 
+------+---------------------+----------+ 
| 1 | 13 mont 12c45 st | NotFound | 
| 2 | 13 mont 12345 st | 12345 | 
| 3 | 13 mont 12c45 45678 | 45678 | 
| 4 | 56789 mont 12c45 st | 56789 | 
+------+---------------------+----------+ 
Смежные вопросы