我想在表中创建一个首字母缩写词列。我想从“名称”列中获取每个单词的第一个字母,将其大写,然后将所有单词连接到“首字母缩略词”列中。
有什么简单的方法来获取第一个字母吗?
Here is an "improved" function, allowing to filter only wanted characters thanks to a regular expression.
initials
does the actual job, you have to specify the regular expressionacronym
does the job keeping Alpha-numeric characters only(Use upper
, lower
or ucase
functions on the output if necessary)
.
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 ;
Example1:
select acronym('Come Again? That Cant Help!');
Outputs:
CATCH
Example2:
select initials('Come Again? That Cant Help!', '[aeiou]');
Outputs:
oeAaaae
这种字符串操作不是 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 ;
这应该将所有第一个字母放入结果集中:
SELECT UPPER(SUBSTR(name, 0, 1)) FROM the_table
我认为,将它们全部连接成一个首字母缩略词需要某种程序。我不认为它可以在一个声明中完成。
我知道这对游戏来说有点晚了,但我想为那些创建视图或 .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
这是两个步骤,您必须为您预期在字符串中的每个单词包含一个条件 substring() 行,但这只是 @spaces 比较值的复制、粘贴和增量。但是,我对这样做的要求可能比某些要求要宽松一些。无论如何,它可以工作并且不会导致明显的速度问题。
SELECT REGEXP_REPLACE( ' Bart Van Eynde', ' (.)[^ ]+', '\\1' ); -- 'BVE'
在查询中:
SELECT UPPER( REGEXP_REPLACE( CONCAT(' ', col1), ' (.)[^ ]+', '\\1' ) ) from table1;