Mysql извлечь первую букву каждого слова в определенном столбце - PullRequest
1 голос
/ 30 декабря 2011

Я хочу создать столбец аббревиатуры в таблице. Я хочу получить первую букву каждого слова из столбца «имя», использовать его заглавными буквами, а затем объединить все в столбец «аббревиатура».

Есть ли простой способ получить первые буквы?

Ответы [ 5 ]

6 голосов
/ 06 сентября 2012

Вот «улучшенная» функция, позволяющая фильтровать только нужные символы благодаря регулярному выражению.

  • функция initials выполняет реальную работу, вам необходимо указать регулярное выражение
  • функция acronym выполняет работу, сохраняя только буквенно-цифровые символы

(при необходимости используйте функции upper, lower или ucase на выходе).

delimiter $$
drop function if exists `initials`$$
CREATE FUNCTION `initials`(str text, expr text) RETURNS text CHARSET utf8
begin
    declare result text default '';
    declare buffer text default '';
    declare i int default 1;
    if(str is null) then
        return null;
    end if;
    set buffer = trim(str);
    while i <= length(buffer) do
        if substr(buffer, i, 1) regexp expr then
            set result = concat( result, substr( buffer, i, 1 ));
            set i = i + 1;
            while i <= length( buffer ) and substr(buffer, i, 1) regexp expr do
                set i = i + 1;
            end while;
            while i <= length( buffer ) and substr(buffer, i, 1) not regexp expr do
                set i = i + 1;
            end while;
        else
            set i = i + 1;
        end if;
    end while;
    return result;
end$$

drop function if exists `acronym`$$
CREATE FUNCTION `acronym`(str text) RETURNS text CHARSET utf8
begin
    declare result text default '';
    set result = initials( str, '[[:alnum:]]' );
    return result;
end$$
delimiter ;

Пример 1:

select acronym('Come Again? That Cant Help!');

Выходы:

CATCH

Пример 2:

select initials('Come Again? That Cant Help!', '[aeiou]');

Выходы:

oeAaaae

1 голос
/ 30 декабря 2011

Подобные манипуляции со строками не предназначены для SQL, если только вы не хотите написать для них хранимую процедуру или UDF.

SQL на самом деле не подходит для манипулирования строками такого рода. Вы можете сделать это каким-то образом но зачем вам, когда в другом месте доступны лучшие инструменты? Я продолжил долгий поиск в Google, чтобы найти такой запрос , но не смог. Просто используйте следующую функцию , чтобы достичь желаемого.

drop function if exists initials;
delimiter ||
create function initials(str text) returns text
begin
    declare result text default '';
    declare i int default 1;

    if(str is null) then
        return null;
    end if;

    set result = upper(substr(str, 1, 1));

    while(i <= length(str)) do
        if (substring(str, i, 1) = ' ')
        then
            set result = concat(result, upper(substr(str, i+1, 1)));
        end if;
       set i = i + 1;
    end while;

    return ucase(result);
end;
delimiter ;
0 голосов
/ 30 июня 2015

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

SELECT
    @spaces:= length(fi.FacilityName) - length(replace(fi.FacilityName,' ','')) as spaces,
    concat(left(fi.FacilityName,1),
        if(@spaces > 0, substring(fi.FacilityName,@pos:=locate(' ',fi.FacilityName)+1,1),''),
        if(@spaces > 1, substring(fi.FacilityName,@pos:=locate(' ',fi.FacilityName, @pos)+1,1),''),
        if(@spaces > 2, substring(fi.FacilityName,@pos:=locate(' ',fi.FacilityName,@pos)+1,1),''),
        if(@spaces > 3, substring(fi.FacilityName,@pos:=locate(' ',fi.FacilityName,@pos)+1,1),''),
        if(@spaces > 4, substring(fi.FacilityName,@pos:=locate(' ',fi.FacilityName,@pos)+1,1),'')) as initials
from facilityInfo fi

Это два шага, и вы должны включить строку условной подстроки () для каждого слова, которое вы ожидаете найти в строке, но это всего лишь копия, вставка и приращение значения сравнения для @spaces.Однако мои требования для этого могут быть немного слабее, чем некоторые.Несмотря на это, он работает и не вызывает заметных проблем со скоростью.

0 голосов
/ 30 декабря 2011

Вы имеете в виду LEFT и UPPER ?

0 голосов
/ 30 декабря 2011

Это должно получить все первые буквы в наборе результатов:

SELECT UPPER(SUBSTR(name, 0, 1)) FROM the_table

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

...