0

私はMySQLMSSQLを異なるサーバーで使用しているため、これを両方の方法で行う方法を学ぶ必要があります。のタイプの列がありvarcharます。通常は と で埋められintegersますfloatsが、ときどき「メモを参照してください」などのテキストで埋められます。ユーザーが結果を数値と比較できるように、クエリビルダーがあります。ユーザーの入力をintegersからfloatsおよび SQL ハンドルに変換することはできますが、これはintegersおよびに対してテストするときに問題ありfloats,ませんが、 に達するたびに問題が発生しvarcharます。

さらに複雑なことに、ユーザー入力はクエリビルダーにあるため、2 つの個別のクエリを実行して分割することはできません。したがって、最初に知っておく必要があるのは、SQL がクエリを処理する方法です。PHP では、if ステートメントがあり、最初の条件が失敗した場合、2 番目の条件に進むことはありません。例:コードは存在しないためif($_POST && $_POST['result'])、結果を読み取ろうとしません。$_POST$_POST

同じように動作する場合は、結果が整数かどうかをテストする方法が必要です。そうであれば、スクリプトの実行を続行できます。しかし、どうすればそれができるのかもわかりません。このようなもの:

SELECT *
FROM my_table
WHERE ISNUMERIC(result) = 1 AND result > 4.5

結果に が含まれている場合varchar、 に到達する前に終了するresult > 4.5ため、ステートメントが壊れてエラーが発生することはありません。

ありがとう。

4

3 に答える 3

1

SQL Server を使用している場合、上記のクエリは正常に機能します。ただし、試してみる代替手段は次のとおりです。

SELECT *
FROM my_table 
WHERE result > 
  CASE WHEN ISNUMERIC(result) = 1
  THEN '5'
  ELSE result
  END

両方のSQL Fiddleを次に示します。

MySQL を使用している場合は、次のように動作するようです。

SELECT *
FROM my_table 
WHERE result > 5

そしてSQLフィドル

于 2013-01-11T00:31:24.340 に答える
1

テーブルのデザインをもう一度見てみたいと思います。通常、ほとんどの場合数値を格納する必要がある場合は、数値フィールドに格納します。テキストを保存する必要がある場合は、テキスト フィールドに保存します。両方を格納する必要がある場合は、2 つのフィールドを使用して null 可能にすることを検討してください (ユーザーは 1 つのフィールドのみを入力する必要があります)。

于 2013-01-11T20:17:13.423 に答える
0

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
于 2013-01-11T00:08:34.437 に答える