2016-07-22 10 views
1

В настоящее время я ищу решение для «вырезания строки» varchar.Выбор строки из varchar MySQL, хранимая процедура

У меня есть курсор, который проходит через все строки, которые я получаю из SQL-запроса. В каждой из этих строк включен «#», и этот я хочу вырезать и вставить в другую таблицу.

Но как я могу вырезать «#» и следующие символы?
Я думал о разделении, но не нашел решения, как это сделать в MySQL.

Я надеюсь, что вы можете мне помочь

+0

Вы можете использовать строковые функции, но логика будет несколько сложной. –

ответ

1

Предполагая, что вы имели строку как first #second third, вы можете использовать строковые функции MySQL для извлечения second:

SUBSTRING(SUBSTRING(col, INSTR(col, '#') + 1), 
      1, 
      INSTR(SUBSTRING(col, INSTR(col, '#') + 1), ' ') - 1) 

Это предполагает, что есть только один диез (#), и что разделитель для конца строки, которую вы хотите извлечь, - это пробел.

+0

Спасибо за ваш ответ, но когда в одной строке больше хэштегов? Как я могу справиться с этим? –

+0

Ну вы можете даже описать логику, как бы вы определили _which_ hashtag - тот, который вы хотите? Я бы сказал, что если это кажется слишком сложным, вы можете лучше читать данные на своем уровне приложения и извлекать его там. –

+0

Нет, я не хочу «одного», когда в этом варчаре больше хэштегов, которые я хочу вырезать. После этого я добавлю их в новую таблицу. –

0

Вот и пример функции, чтобы сделать это

delimiter // 
CREATE DEFINER=`root`@`localhost` FUNCTION `cut`(`instring` varchar(255)) 
    RETURNS varchar(255) CHARSET latin1 
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
begin 
declare tempstring varchar(100); 
declare outstring varchar(100); 
declare checkit int; 
declare firsthashpos int; 
declare tempid int; 

set tempstring = ltrim(rtrim(instring)); 
set checkit = 0; 


if instr(tempstring,'#') then set firsthashpos = instr(tempstring,'#'); end if; 

looper: while tempstring is not null and instr(tempstring,'#') > 0 do 

     set outstring = reverse(substring(reverse(tempstring),1,instr(reverse(tempstring),'#'))); 
     set tempstring = replace(tempstring,reverse(substring(reverse(tempstring),1,instr(reverse(tempstring),'#'))),''); 

     insert into b (address) values (outstring); 

end while; 

return concat(tempstring); 
end// 
delimiter ; 

дал это

select * from a; 
+------+---------------------+ 
| id | address    | 
+------+---------------------+ 
| 1 | 13 #ont 12#45 st | 
| 2 | 13 #ont 12345 st | 
| 3 | 13 #ont 12#45 45678 | 
| 4 | 56789 #ont 12#45 st | 
+------+---------------------+ 

результат от

select id,address,cut(address) 
from a 
where instr(address,'#') > 0; 

Результаты в б

select * from b; 
+----+---------------+ 
| id | address  | 
+----+---------------+ 
| 1 | #45 st  | 
| 2 | #ont 12  | 
| 3 | #ont 12345 st | 
| 4 | #45 45678  | 
| 5 | #ont 12  | 
| 6 | #45 st  | 
| 7 | #ont 12  | 
+----+---------------+ 

Возвращаемое значение функции (outstring) содержит то, что осталось после бит после удаления #s. Надеемся, что манипуляция строк в функции не требует пояснений.

+0

Ха-ха, спасибо, но я решил сделать это в php :) –