0

Testという名前のテーブルがあります

Test
Name   Value1(varchar)   Value2(varchar)
A          1                  9
B          10                 19
C          20                 39
D          40                 45
...        ...                ...

「8」や「21」などの値を送信するときに、テストテーブルから名前を取得するにはどうすればよいですか。

4

1 に答える 1

4

ええと、なぜあなたのコラムはVARCHAR

DECLARE @n INT = 8;

SELECT Name FROM dbo.Test
  WHERE @n BETWEEN CONVERT(INT, Value1) AND CONVERT(INT, Value2);

これらの列に他のジャンクがある場合は、SQL Serverがあなたを裏切って'ascfdgt'整数に変換しようとするのを防ぐために、次のようなことをしなければならない場合があります。

DECLARE @n INT = 8;

SELECT Name FROM dbo.Test
  WHERE ISNUMERIC(Value1) = 1
    AND ISNUMERIC(Value2) = 1
    AND @n BETWEEN CASE WHEN ISNUMERIC(Value1) = 1 THEN CONVERT(INT, Value1) END
               AND CASE WHEN ISNUMERIC(Value2) = 1 THEN CONVERT(INT, Value2) END;

ここで、この列のデータ型を修正するか、これらの数値を別の列に格納してください。

パスして、 isとisのA12行を見つける必要がある場合は、もう少し複雑になります。Value1A010Value2A029

DECLARE @n VARCHAR(12) = 'A12';

SELECT Name FROM dbo.Test
  WHERE ISNUMERIC(SUBSTRING(Value1, 2, 255)) = 1
    AND ISNUMERIC(SUBSTRING(Value2, 2, 255)) = 1
    AND CONVERT(INT, SUBSTRING(@n, 2, 255)) 
      BETWEEN CASE WHEN ISNUMERIC(SUBSTRING(Value1, 2, 255)) = 1
        THEN CONVERT(INT, SUBSTRING(Value1, 2, 255)) END
          AND CASE WHEN ISNUMERIC(SUBSTRING(Value2, 2, 255)) = 1
        THEN CONVERT(INT, SUBSTRING(Value2, 2, 255)) END;

それがどれほど醜いのか分かりますか?このようなスパゲッティクエリでコードベースを散らかす必要がないように、このひどいデザインを修正することを検討してください。

于 2013-03-14T01:48:27.953 に答える