1

要件は、米国英語辞書に基づいて列値の大文字と小文字を区別するテキストを置き換えることです

以下はサンプルです

Colour => color
Color => Color (note that C is capitalized here)

FIBRE => FIBER

Colour/Monochrome => Color/Monochrome
4

2 に答える 2

1

この機能は機能すると主張しましたが、私はチェックしませんでしたが、別の質問でユーザーはこれを回答として受け入れました

http://pento.net/2009/02/15/case-insensitive-replace-for-mysql/

これが機能しない場合はお知らせください

于 2012-10-09T05:22:51.940 に答える
0

これを試して:

DELIMITER $$
DROP FUNCTION IF EXISTS `replace_ci`$$
CREATE FUNCTION `replace_ci` (str TEXT, needle CHAR(255), str_rep CHAR(255))
    RETURNS TEXT
    DETERMINISTIC
    BEGIN
        DECLARE return_str TEXT DEFAULT '';
        DECLARE lower_str TEXT;
        DECLARE lower_needle TEXT;
        DECLARE pos INT DEFAULT 1;
        DECLARE old_pos INT DEFAULT 1;
        SELECT lower(str) INTO lower_str;
        SELECT lower(needle) INTO lower_needle;
        SELECT locate(lower_needle, lower_str, pos) INTO pos;
        WHILE pos > 0 DO
            SELECT concat(return_str, substr(str, old_pos, pos-old_pos), str_rep) INTO return_str;
            SELECT pos + char_length(needle) INTO pos;
            SELECT pos INTO old_pos;
            SELECT locate(lower_needle, lower_str, pos) INTO pos;
        END WHILE;
        SELECT concat(return_str, substr(str, old_pos, char_length(str))) INTO return_str;

        /** mirror the case **/
        IF (BINARY LEFT(str,1) = LOWER(LEFT(str,1))) THEN
            SET return_str = LOWER(return_str);
        ELSE
            IF (BINARY LEFT(str,2) = UPPER(LEFT(str,2))) THEN
                SET return_str = UPPER(return_str);
            ELSE          
                SET return_str = CONCAT( UPPER(LEFT(return_str,1)), LOWER(RIGHT(return_str, LENGTH(return_str) - 1)) );
            END IF;
        END IF;

        RETURN return_str;
END$$
DELIMITER ;

大文字と小文字を区別しない置換関数(他の回答で言及されている)を変更して、元の文字列の大文字と小文字を「ミラーリング」しました

(/** の後のコードのセクションを参照してください **/)。

ただし、入力文字列が次のいずれかであるという 3 つのシナリオのみをチェックします。

  • 小文字
  • 大文字
  • 頭文字大文字

しかし、これらの3つのシナリオでは機能するはずです-つまり

繊維 => 繊維

繊維 => 繊維

繊維 => 繊維

于 2012-10-09T14:25:07.283 に答える