【SQLServer】小数点以下の末尾の0を削除
当たり前だけど、数値を文字列として比較する際に、
数値としては等しくても、右辺と左辺で桁数が違うと違う値として判断される。
数値のままで比較してしまえば問題ないのだけど、
既に比較用のユーザー関数があって、引数がNVARCHAR等の文字列型の場合に、
呼び出し元の方で桁数などを合わせてから渡してやらないといけなかったりする。
そんな時にちょっと使えるかな??
けっこう適当なのでもっといい方法教えておくれ_(_^_)_
小数点が無ければ正数値のみ返すし、
小数点があれば、最少の有効桁数(なんて言えばいいか分からない)で返す。
みたいな感じ。
ファンクション
CREATE FUNCTION [dbo].[F_ZEROCUT] /* 小数点以下の0削除 */ ( @P_DATA DECIMAL(38,15) ) RETURNS NVARCHAR AS BEGIN DECLARE @Ret NVARCHAR = ''; IF @P_DATA <> CONVERT(DECIMAL(38,0),@P_DATA) BEGIN --小数点有 IF @P_DATA = CONVERT(DECIMAL(38,1),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,1),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,2),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,2),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,3),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,3),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,4),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,4),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,5),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,5),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,6),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,6),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,7),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,7),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,8),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,8),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,9),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,9),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,10),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,10),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,11),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,11),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,12),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,12),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,13),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,13),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,14),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,14),@P_DATA)) ELSE IF @P_DATA = CONVERT(DECIMAL(38,15),@P_DATA) SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,15),@P_DATA)) END ELSE SET @Ret = CONVERT(NVARCHAR,CONVERT(DECIMAL(38,0),@P_DATA)) RETURN @Ret END