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

俺氏、本を読む

30歳になるまでに本を読んで勉強しようかと。主に啓発、お金についての本を読むつもり。一応プログラマーなのでその辺のことも

【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
広告を非表示にする