1. ホーム
  2. sql

[解決済み] TSQL - 文字列を整数にキャストする、またはデフォルト値を返す

2022-09-13 19:33:45

質問

T-SQL で nvarchar を int にキャストし、変換に失敗した場合にデフォルト値または NULL を返す方法はありますか?

どのように解決するのですか?

SQL Server 2012 (またはそれ以降) を使用している場合。

を使用します。 TRY_CONVERT関数 .

SQL Server 2005、2008、または2008 R2を使用している場合。

ユーザー定義関数を作成します。これにより、以下のような問題が回避されます。 Fedor Hajdu が言及した のような、通貨や端数などに関する問題を回避することができます。

CREATE FUNCTION dbo.TryConvertInt(@Value varchar(18))
RETURNS int
AS
BEGIN
    SET @Value = REPLACE(@Value, ',', '')
    IF ISNUMERIC(@Value + 'e0') = 0 RETURN NULL
    IF ( CHARINDEX('.', @Value) > 0 AND CONVERT(bigint, PARSENAME(@Value, 1)) <> 0 ) RETURN NULL
    DECLARE @I bigint =
        CASE
        WHEN CHARINDEX('.', @Value) > 0 THEN CONVERT(bigint, PARSENAME(@Value, 2))
        ELSE CONVERT(bigint, @Value)
        END
    IF ABS(@I) > 2147483647 RETURN NULL
    RETURN @I
END
GO

-- Testing
DECLARE @Test TABLE(Value nvarchar(50))    -- Result
INSERT INTO @Test SELECT '1234'            -- 1234
INSERT INTO @Test SELECT '1,234'           -- 1234
INSERT INTO @Test SELECT '1234.0'          -- 1234
INSERT INTO @Test SELECT '-1234'           -- -1234
INSERT INTO @Test SELECT '$1234'           -- NULL
INSERT INTO @Test SELECT '1234e10'         -- NULL
INSERT INTO @Test SELECT '1234 5678'       -- NULL
INSERT INTO @Test SELECT '123-456'         -- NULL
INSERT INTO @Test SELECT '1234.5'          -- NULL
INSERT INTO @Test SELECT '123456789000000' -- NULL
INSERT INTO @Test SELECT 'N/A'             -- NULL
SELECT Value, dbo.TryConvertInt(Value) FROM @Test

参照 私が使ったのは このページ を多用しました。