読者です 読者をやめる 読者になる 読者になる

全角スペースを含む文字列でTrimしたい

SQLServer T-SQL

照合順序(Collation)とは

SQLServerには高機能な照合順序(Collation)の設定機能があります。
日本語関連だとこちら、World Wideにはこちら*1にまとめてあります。

REPLACE関数だとこんな感じ↓

-- 普通は COLLATE Japanese_CI_ASになってるでしょう
SELECT REPLACE('a b c', ' ', '!')
-- 'a!b!c'が返ります

ところが、LTRIM関数&RTRIM関数は別物です。(;_;)

SELECT RTRIM(LTRIM(' abc '))
-- ' abc 'が返ります。(;_;)

二人の出来ない子(LTRIM関数&RTRIM関数)には照合順序(Collation)が実装されて無い模様です。(;_;)

しょうがないので

全角スペースが含む文字列でもそれっぽいことをやってくれる関数を作りました。あくまでも"それっぽい"ので、入力文字列の残す部分に半角スペースが2つ連続してると全角スペースに変換されて出力されるという制限*2があります。

/*
ZTrim 関数

NULLを考慮して、文字列のはじめと終わりのスペース(全角含む)を削除する関数です。
*/

CREATE FUNCTION [dbo].[ZTrim]
(
    @value VARCHAR(8000)
) 
RETURNS VARCHAR(8000)
AS
BEGIN
	SET @value = COALESCE(@value, '')
	SET @value = REPLACE(@value COLLATE Japanese_BIN, ' ', '  ')
	SET @value = RTRIM(LTRIM(@value))
	SET @value = REPLACE(@value COLLATE Japanese_BIN, '  ', ' ')
	RETURN @value
END

*1:SQL Server Compact Editionだけど

*2:ありていに言えばバグですが何かw