2016-02-25 3 views
0

У меня есть запрос в MySQLУдалить все после того, как плюс в MySQL

select various(functions(here(...))) foo, count(*) ct 
from table 
group by foo 
having ct > 1; 

, который выглядит для дублирования данных. Я хотел бы изменить запрос, чтобы удалить плюсовые знаки и все, что следует за ними из foo, так что если various(functions(here(...))) дает foo+bar, я получаю только foo. (Если знак плюса не встречается, он остается неизменным.)

Каков наилучший способ сделать это? Я могу использовать replace

select if(locate("+", various(functions(here(...))))>0, left(various(functions(here(...))), locate("+", various(functions(here(...)))) - 1), various(functions(here(...)))) foo, count(*) ct 
from table 
where conditions 
group by foo 
having ct > 1; 

, но это, кажется, как «очевидно» неправильные вещи. Regex было бы неплохо, но они не существуют в MySQL, насколько я знаю. Подзапрос делает это немного менее громоздким

select if(locate("+", bar)>0, left(bar, locate("+", bar)-1), bar) foo 
from table 
left join (
    select pkey, various(functions(here(...))) bar 
    from table 
    where conditions 
) subtable using(pkey) 
group by foo 
having ct > 1 
; 

но таблица большая, я хотел бы знать, если есть более эффективный и более ремонтопригодны решение.

ответ

1

Использование substring_index():

select substring_index(various(functions(here(...))), '+', 1) as foo, count(*) ct 
from table 
group by foo 
having ct > 1; 
+0

Так просто! Извините, я пропустил это. – Charles