半角カタカナを全角に、全角英数字を半角にしたい時ありますよね
PHPであればmb_convert_kana()があります
今回、変換したいのはSQL Severのとある列なんです
スカラ関数作りました
mb_convert_kana()の機能とほぼ同じく作りました
違いとしてはVオプションが強制onになっています
Vオプションがoffのパターンも実装したのですが、動かなかったもので・・・
CREATE FUNCTION
[dbo].[convertKana]
(
@String AS VARCHAR(2048),
@OPTION AS VARCHAR(24)
) RETURNS VARCHAR(2048)
AS
BEGIN
/*
** PHP: mb_convert_kana() のSQL版
**
** @String: 入力文字列
** @Option: オプション(http://php.net/manual/ja/function.mb-convert-kana.php)
**
**
** PHP の mb_convert_kana() との違い
** 1. 濁点付きは強制的に一文字に変換します SQL サーバーの仕様のため
** 2. encodingがありません
**/
DECLARE
@i AS INT,
@l AS INT,
@KEY AS CHAR(1),
@ReturnStr AS VARCHAR(4000),
@AZ_Size AS INT,
@NM_Size AS INT,
@Word_Size AS INT,
@DWord_Size AS INT,
@Mark_Size AS INT
SET
@AZ_Size = 52 /* 英字 */
SET
@NM_Size = 10 /* 数字 */
SET
@Word_Size = 56 /* 濁音・半濁音以外 */
SET
@DWord_Size = 26 /* 濁音・半濁音 */
SET
@Mark_Size = 28 /* 記号 */
DECLARE
@DakuonOpt AS INT,
@Hankaku_AZ AS NVARCHAR(52),
@Zenkaku_AZ AS NVARCHAR(52),
@Hankaku_NM AS NVARCHAR(10),
@Zenkaku_NM AS NVARCHAR(10),
@Hankaku_KK_Normal AS NVARCHAR(56),
@Zenkaku_KK_Normal AS NVARCHAR(56),
@Zenkaku_HK_Normal AS NVARCHAR(56),
@Hankaku_KK_Dakuon AS NVARCHAR(52), /* LEN(@Zenkaku_KK_Dakuon) x 2 */
@Zenkaku_KK_Dakuon AS NVARCHAR(26),
@Zenkaku_HK_Dakuon AS NVARCHAR(26),
@Zenkaku_MR AS NVARCHAR(28),
@Hankaku_MR AS NVARCHAR(28)
IF
@String IS NULL
BEGIN
RETURN NULL
END
SET
@Hankaku_AZ = 'ABCDEFGHIJKLMNOPQRSTUVWXWZabcdefghijklmnopqrstuvwxyz'
SET
@Zenkaku_AZ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
SET
@Hankaku_NM = '0123456789'
SET
@Zenkaku_NM = '0123456789'
SET
@Zenkaku_HK_Normal = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんっゃゅょぁぃぅぇぉー'
SET
@Zenkaku_KK_Normal = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォー'
SET
@Hankaku_KK_Normal = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォー'
SET
@Zenkaku_HK_Dakuon = 'がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴ'
SET
@Zenkaku_KK_Dakuon = 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ'
SET
@Hankaku_KK_Dakuon = 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ'
SET
@Zenkaku_MR = '!#$%&()*+,-./:;<=>?@[]^_`{|}'
SET
@Hankaku_MR = '!#$%&()*+,-./:;<=>?@[]^_`{|}'
SET
@DakuonOpt = 0
IF
@OPTION IS NULL
BEGIN
SET
@OPTION = 'KV'
END
IF
CHARINDEX('V', @OPTION) > 0
BEGIN
SET
@DakuonOpt = 1
SET
@OPTION = REPLACE(@OPTION,'V','')
END
SET
@OPTION = REPLACE(@OPTION,'a', 'rnm')
SET
@OPTION = REPLACE(@OPTION,'A', 'RNM')
SET
@ReturnStr = @String
SET
@i = 1
WHILE
@i <= LEN(@OPTION)
BEGIN
SET
@KEY = SUBSTRING(@OPTION,@i,1)
IF
@KEY = 's' /* 全角スペース to 半角スペース */
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr,' ', ' ')
END
IF
@KEY = 'S' /* 半角スペース to 全角スペース */
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr,' ', ' ')
END
IF
@KEY = 'r' /* 全角英字 to 半角英字 */
BEGIN
SET
@l = 1
WHILE
@l <= @AZ_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_AZ,@l,1), SUBSTRING(@Hankaku_AZ,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'R' /* 半角英字 to 全角英字 */
BEGIN
SET
@l = 1
WHILE
@l <= @AZ_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_AZ,@l,1), SUBSTRING(@Zenkaku_AZ,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'n' /* 全角数字 to 半角数字 */
BEGIN
SET
@l = 1
WHILE
@l <= @NM_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_NM,@l,1), SUBSTRING(@Hankaku_NM,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'N' /* 半角数字 to 全角数字 */
BEGIN
SET
@l = 1
WHILE
@l <= @NM_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_NM,@l,1), SUBSTRING(@Zenkaku_NM,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'k' /* 全角カタカナ to 半角カタカナ */
BEGIN
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_KK_Dakuon,@l,1), SUBSTRING(@Hankaku_KK_Dakuon,@l*2-1,2))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_KK_Normal,@l,1), SUBSTRING(@Hankaku_KK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'K' /* 半角カタカナ to 全角カタカナ */
BEGIN
/* 濁音考えるモード */
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_KK_Dakuon,@l*2-1,2), SUBSTRING(@Zenkaku_KK_Dakuon,@l,1))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_KK_Normal,@l,1), SUBSTRING(@Zenkaku_KK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'h' /* 全角ひらがな to 半角カタカナ */
BEGIN
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_HK_Dakuon,@l,1), SUBSTRING(@Hankaku_KK_Dakuon,@l,2))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_HK_Normal,@l,1), SUBSTRING(@Hankaku_KK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'H' /* 半角カタナカ to 全角ひらがな */
BEGIN
/* 濁音考えるモード */
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_KK_Dakuon,@l*2-1,2), SUBSTRING(@Zenkaku_HK_Dakuon,@l,1))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_KK_Normal,@l,1), SUBSTRING(@Zenkaku_HK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'c' /* 全角カタカナ to 全角ひらがな */
BEGIN
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_KK_Dakuon,@l,1), SUBSTRING(@Zenkaku_HK_Dakuon,@l,1))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_KK_Normal,@l,1), SUBSTRING(@Zenkaku_HK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'C' /* 全角ひらがな to 全角カタカナ */
BEGIN
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_HK_Dakuon,@l,1), SUBSTRING(@Zenkaku_KK_Dakuon,@l,1))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_HK_Normal,@l,1), SUBSTRING(@Zenkaku_KK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'm' /* 全角記号 to 全角記号 */
BEGIN
SET
@l = 1
WHILE
@l <= @Mark_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_MR,@l,1), SUBSTRING(@Hankaku_MR,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'M' /* 全角記号 to 全角記号 */
BEGIN
SET
@l = 1
WHILE
@l <= @Mark_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_MR,@l,1), SUBSTRING(@Zenkaku_MR,@l,1))
SET
@l = @l+1
END
END
SET
@i = @i+1
END
RETURN @ReturnStr
END
[dbo].[convertKana]
(
@String AS VARCHAR(2048),
@OPTION AS VARCHAR(24)
) RETURNS VARCHAR(2048)
AS
BEGIN
/*
** PHP: mb_convert_kana() のSQL版
**
** @String: 入力文字列
** @Option: オプション(http://php.net/manual/ja/function.mb-convert-kana.php)
**
**
** PHP の mb_convert_kana() との違い
** 1. 濁点付きは強制的に一文字に変換します SQL サーバーの仕様のため
** 2. encodingがありません
**/
DECLARE
@i AS INT,
@l AS INT,
@KEY AS CHAR(1),
@ReturnStr AS VARCHAR(4000),
@AZ_Size AS INT,
@NM_Size AS INT,
@Word_Size AS INT,
@DWord_Size AS INT,
@Mark_Size AS INT
SET
@AZ_Size = 52 /* 英字 */
SET
@NM_Size = 10 /* 数字 */
SET
@Word_Size = 56 /* 濁音・半濁音以外 */
SET
@DWord_Size = 26 /* 濁音・半濁音 */
SET
@Mark_Size = 28 /* 記号 */
DECLARE
@DakuonOpt AS INT,
@Hankaku_AZ AS NVARCHAR(52),
@Zenkaku_AZ AS NVARCHAR(52),
@Hankaku_NM AS NVARCHAR(10),
@Zenkaku_NM AS NVARCHAR(10),
@Hankaku_KK_Normal AS NVARCHAR(56),
@Zenkaku_KK_Normal AS NVARCHAR(56),
@Zenkaku_HK_Normal AS NVARCHAR(56),
@Hankaku_KK_Dakuon AS NVARCHAR(52), /* LEN(@Zenkaku_KK_Dakuon) x 2 */
@Zenkaku_KK_Dakuon AS NVARCHAR(26),
@Zenkaku_HK_Dakuon AS NVARCHAR(26),
@Zenkaku_MR AS NVARCHAR(28),
@Hankaku_MR AS NVARCHAR(28)
IF
@String IS NULL
BEGIN
RETURN NULL
END
SET
@Hankaku_AZ = 'ABCDEFGHIJKLMNOPQRSTUVWXWZabcdefghijklmnopqrstuvwxyz'
SET
@Zenkaku_AZ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
SET
@Hankaku_NM = '0123456789'
SET
@Zenkaku_NM = '0123456789'
SET
@Zenkaku_HK_Normal = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんっゃゅょぁぃぅぇぉー'
SET
@Zenkaku_KK_Normal = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォー'
SET
@Hankaku_KK_Normal = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンッャュョァィゥェォー'
SET
@Zenkaku_HK_Dakuon = 'がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴ'
SET
@Zenkaku_KK_Dakuon = 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ'
SET
@Hankaku_KK_Dakuon = 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ'
SET
@Zenkaku_MR = '!#$%&()*+,-./:;<=>?@[]^_`{|}'
SET
@Hankaku_MR = '!#$%&()*+,-./:;<=>?@[]^_`{|}'
SET
@DakuonOpt = 0
IF
@OPTION IS NULL
BEGIN
SET
@OPTION = 'KV'
END
IF
CHARINDEX('V', @OPTION) > 0
BEGIN
SET
@DakuonOpt = 1
SET
@OPTION = REPLACE(@OPTION,'V','')
END
SET
@OPTION = REPLACE(@OPTION,'a', 'rnm')
SET
@OPTION = REPLACE(@OPTION,'A', 'RNM')
SET
@ReturnStr = @String
SET
@i = 1
WHILE
@i <= LEN(@OPTION)
BEGIN
SET
@KEY = SUBSTRING(@OPTION,@i,1)
IF
@KEY = 's' /* 全角スペース to 半角スペース */
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr,' ', ' ')
END
IF
@KEY = 'S' /* 半角スペース to 全角スペース */
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr,' ', ' ')
END
IF
@KEY = 'r' /* 全角英字 to 半角英字 */
BEGIN
SET
@l = 1
WHILE
@l <= @AZ_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_AZ,@l,1), SUBSTRING(@Hankaku_AZ,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'R' /* 半角英字 to 全角英字 */
BEGIN
SET
@l = 1
WHILE
@l <= @AZ_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_AZ,@l,1), SUBSTRING(@Zenkaku_AZ,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'n' /* 全角数字 to 半角数字 */
BEGIN
SET
@l = 1
WHILE
@l <= @NM_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_NM,@l,1), SUBSTRING(@Hankaku_NM,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'N' /* 半角数字 to 全角数字 */
BEGIN
SET
@l = 1
WHILE
@l <= @NM_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_NM,@l,1), SUBSTRING(@Zenkaku_NM,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'k' /* 全角カタカナ to 半角カタカナ */
BEGIN
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_KK_Dakuon,@l,1), SUBSTRING(@Hankaku_KK_Dakuon,@l*2-1,2))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_KK_Normal,@l,1), SUBSTRING(@Hankaku_KK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'K' /* 半角カタカナ to 全角カタカナ */
BEGIN
/* 濁音考えるモード */
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_KK_Dakuon,@l*2-1,2), SUBSTRING(@Zenkaku_KK_Dakuon,@l,1))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_KK_Normal,@l,1), SUBSTRING(@Zenkaku_KK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'h' /* 全角ひらがな to 半角カタカナ */
BEGIN
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_HK_Dakuon,@l,1), SUBSTRING(@Hankaku_KK_Dakuon,@l,2))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_HK_Normal,@l,1), SUBSTRING(@Hankaku_KK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'H' /* 半角カタナカ to 全角ひらがな */
BEGIN
/* 濁音考えるモード */
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_KK_Dakuon,@l*2-1,2), SUBSTRING(@Zenkaku_HK_Dakuon,@l,1))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_KK_Normal,@l,1), SUBSTRING(@Zenkaku_HK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'c' /* 全角カタカナ to 全角ひらがな */
BEGIN
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_KK_Dakuon,@l,1), SUBSTRING(@Zenkaku_HK_Dakuon,@l,1))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_KK_Normal,@l,1), SUBSTRING(@Zenkaku_HK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'C' /* 全角ひらがな to 全角カタカナ */
BEGIN
SET
@l = 1
WHILE
@l <= @DWord_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_HK_Dakuon,@l,1), SUBSTRING(@Zenkaku_KK_Dakuon,@l,1))
SET
@l = @l+1
END
SET
@l = 1
WHILE
@l <= @Word_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_HK_Normal,@l,1), SUBSTRING(@Zenkaku_KK_Normal,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'm' /* 全角記号 to 全角記号 */
BEGIN
SET
@l = 1
WHILE
@l <= @Mark_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Zenkaku_MR,@l,1), SUBSTRING(@Hankaku_MR,@l,1))
SET
@l = @l+1
END
END
IF
@KEY = 'M' /* 全角記号 to 全角記号 */
BEGIN
SET
@l = 1
WHILE
@l <= @Mark_Size
BEGIN
SET
@ReturnStr = REPLACE(@ReturnStr, SUBSTRING(@Hankaku_MR,@l,1), SUBSTRING(@Zenkaku_MR,@l,1))
SET
@l = @l+1
END
END
SET
@i = @i+1
END
RETURN @ReturnStr
END
COLLATE で半角・全角を同じく扱うこともできます
しかし、半角・全角が同じく扱われるのですが、正規化はされないんですよね・・・
それで作りました clr で作れって話はしないでくださいね(^^)
SQLServerの照合順序によっては、@KEY が ‘k’の時、@KEY = ‘k’と@KEY = ‘K’もtrueになるので、うまく動かないんですよね、、、、