INT
テキスト入力が与えられた場合、値を解析できない場合は 、または NULLを返す関数があると非常に便利であることがわかりました。その後、単にクエリを実行できます
WHERE dbo.ParseInteger(result) >= 3
私の場合、整数のみに関心がありますが、これを拡張して浮動小数点数に対応できると確信しています。これは、必要以上に複雑になる場合があります。たとえば、指数を気にしない場合は、70% を捨てることができます。私は MySQL に慣れすぎて翻訳を提供できません。最後に、私は英語形式の数字を想定していることに注意してください。異なるグループ区切り記号と小数点区切り記号を使用している可能性があります。
CREATE FUNCTION dbo.ParseInteger(@Input VARCHAR(100)) RETURNS BIGINT WITH SCHEMABINDING
AS BEGIN
SET @Input = dbo.Trim(@Input) -- If you're not worried about linebreaks or other odd chars, LTRIM(RTRIM(@Input)) will be fine
IF ISNUMERIC(@Input) = 0 RETURN NULL
IF @Input IN ('.', '+', '-', ',') RETURN NULL
SET @Input = REPLACE(@Input, ',', '') -- Strip commas
DECLARE @DecimalPos INT = CHARINDEX('.', @Input)
DECLARE @ExpPos INT = CHARINDEX('E', @Input)
DECLARE @IntValue BIGINT
IF @DecimalPos = 0 AND @ExpPos = 0
BEGIN
-- There's no decimal and no exponent, so we can easily cast this bog-standard integer
SET @IntValue = CAST(@Input AS BIGINT)
END
ELSE IF @DecimalPos > 0 AND @ExpPos = 0
BEGIN
-- There's a decimal point but no exponent; we can cast the integer part, and then nudge it if necessary to round off the tenths place
SET @IntValue = CAST(SUBSTRING(@Input, 1, @DecimalPos - 1) AS BIGINT)
IF SUBSTRING(@Input, @DecimalPos + 1, 1) BETWEEN '5' AND '9'
IF @IntValue < 0
SET @IntValue -= 1
ELSE
SET @IntValue += 1
END
ELSE
BEGIN
-- There's an exponent, and probably a decimal; this will be relatively complicated
IF @DecimalPos = 0
BEGIN
-- There's no decimal; insert one, just so we have consistency downstream
SET @Input = LEFT(@Input, @ExpPos - 1) + '.0E' + RIGHT(@Input, LEN(@Input) - @ExpPos)
SET @DecimalPos = @ExpPos
SET @ExpPos += 2
END
DECLARE @Magnitude INT = CASE WHEN LEFT(@Input, 1) = '-' THEN @DecimalPos - 2 ELSE @DecimalPos - 1 END -- For normalized scientific notation, this will always be one, but we can't expect that
DECLARE @Exponent INT = CAST(RIGHT(@Input, LEN(@Input) - @ExpPos) AS INT)
IF @Exponent > 18 RETURN NULL -- BIGINT can handle values up to 2^63, or 9.2E18
SET @Input = REPLACE(SUBSTRING(@Input, 1, @ExpPos - 1), '.', '')
DECLARE @MagAdjustment INT = @Magnitude + @Exponent - CASE WHEN LEFT(@Input, 1) = '-' THEN LEN(@Input) - 1 ELSE LEN(@Input) END
IF @MagAdjustment > 0
BEGIN
SET @Input += REPLICATE('0', @MagAdjustment)
END
ELSE IF @MagAdjustment < 0
BEGIN
WHILE -@MagAdjustment > @Magnitude AND LEN(@Input) > 1
BEGIN
SET @MagAdjustment += 1
SET @Input = SUBSTRING(@Input, 1, LEN(@Input) - 1)
END
IF -@MagAdjustment > @Magnitude SET @Input = '0'
ELSE IF -@MagAdjustment = @Magnitude SET @Input = CASE WHEN LEFT(@Input, 1) BETWEEN '5' AND '9' THEN '1' WHEN LEFT(@Input, 2) BETWEEN '-5' AND '-9' THEN '-1' ELSE '0' END
ELSE SET @Input = SUBSTRING(@Input, 1, CASE WHEN LEFT(@Input, 1) = '-' THEN 1 ELSE 0 END + LEN(@Input) + @MagAdjustment)
END
SET @IntValue = CAST(@Input AS BIGINT)
END
RETURN @IntValue
END