SQL Function で半角カタカナを全角カタカナに変換

Pocket

半角カタカナを全角に、全角英数字を半角にしたい時ありますよね
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

COLLATE で半角・全角を同じく扱うこともできます
しかし、半角・全角が同じく扱われるのですが、正規化はされないんですよね・・・
それで作りました clr で作れって話はしないでくださいね(^^)

1件のコメント

  1. SQLServerの照合順序によっては、@KEY が ‘k’の時、@KEY = ‘k’と@KEY = ‘K’もtrueになるので、うまく動かないんですよね、、、、

コメントを残す