1

テーブルに頭字語の列を作成したい。「名前」列から各単語の最初の文字を取得し、それを大文字にしてから、すべてを「頭字語」列に連結したいと思います。

最初の文字を取得する簡単な方法はありますか?

4

6 に答える 6

7

これが「改善された」機能で、正規表現のおかげで必要な文字だけをフィルタリングできます。

  • 関数initialsは実際の仕事をします、あなたは正規表現を指定しなければなりません
  • 関数acronymは英数字のみを保持するジョブを実行します

(、、または必要に応じて出力の関数を使用upperlowerます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!');

出力:

キャッチ

例2:

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

出力:

oeAaaae

于 2012-09-06T09:55:08.667 に答える
1

この種の文字列操作は、ストアドプロシージャまたはUDFを作成する場合を除いて、SQLの目的ではありません。

SQLは、この種の文字列操作にはあまり適していません。あなたどういうわけかそれをするかもしれませんが、より良いツールが他の場所で利用できるのになぜあなたはそうしますか?私はそのようなクエリステートメントを見つけるためにグーグルで長い検索をしましたが、私は見つけることができませんでした。次の機能を使用するだけで、目的を達成できます。

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 ;
于 2011-12-29T21:24:01.630 に答える
0

これにより、すべての最初の文字が結果セットに含まれるはずです。

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

それらすべてを単一の頭字語に連結するには、何らかの手順が必要になると思います。私はそれが声明で行うことができるとは思わない。

于 2011-12-29T20:13:23.553 に答える
0

LEFTUPPERのことですか?

于 2011-12-29T20:15:29.777 に答える
0

これはゲームに少し遅れていることは知っていますが、定期的に使用するビューまたは.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

これは2つのステップであり、文字列に含まれると予想されるすべての単語に条件付きsubstring()行を含める必要がありますが、これは@spacesの比較値のコピー、貼り付け、および増分にすぎません。ただし、これを行うための私の要件は、いくつかよりも少し緩いかもしれません。とにかく、それは機能し、目立った速度の問題を引き起こしません。

于 2015-06-30T13:25:45.743 に答える
0
SELECT REGEXP_REPLACE( ' Bart Van Eynde', ' (.)[^ ]+', '\\1' ); -- 'BVE'
  • 始める前に文字列の前にスペースを追加してください
  • '(。)[^] +'=スペースの検索を開始+何か(そしてそれを保存)+スペースでない場合は残りを無視する
  • '\\1'は'何か'を書き戻すだけです

クエリで:

SELECT UPPER( REGEXP_REPLACE( CONCAT(' ', col1), ' (.)[^ ]+', '\\1' ) ) from table1;
于 2021-02-12T10:58:58.090 に答える