1

次の形式のテーブルを扱っています。

  A        B
  ------   -----------
   1       value1
   2       value2
   3       value3
  -1       value4

この表では、列に-1他に一致するものがない場合、値はすべてをキャッチすることを示しAます。これは、 のクエリは、列 B の値でA = 2ある単一のレコードを返す必要があることを意味します。たとえば、テーブルがクエリされた場合、B の値は次のようになります(これはキャッチオールに関連付けられた値であるため)。value2A = 6value4

これを達成するための「最良の」クエリは何ですか? より良い解決策はありますか?それが役立つ場合は、 SQLFiddleで小さなセットアップ例をスクリプト化しました。

データベースは SQL Server です。

手伝ってくれますか?どうもありがとう。

4

5 に答える 5

2
DECLARE @param int
SET @param = 6

SELECT * 
FROM test
WHERE a = @param OR (
    a = -1 AND @param NOT IN (SELECT a FROM test)
)

に置き換え@param = 6@param = 2再度テストします

于 2012-07-26T17:25:20.573 に答える
2
select top (1) A, B
from (
  select A, B, 0 as priority from t where A = @value
  union
  select A, B, 1             from t where A = -1
) foo
order by priority
于 2012-07-26T17:23:59.693 に答える
1

MySQL では、これは簡単です。

SELECT b FROM test WHERE a = @var or a = -1 ORDER BY a DESC LIMIT 1;

ただし、MSSQL にはそのようなトリックは組み込まれていません。適切に制限するには、ストアド プロシージャを追加する必要があります。

編集 2005 年に、いくつかのページング機能が追加されたようです。

SELECT TOP 1 b FROM test WHERE a = @var or a = -1 ORDER BY a DESC; 

動作するはずです。

そうは言っても、これは設計が不十分な問題のように思えます。これを必要とするアプリケーションを調べて、デフォルト値を達成するためのよりクリーンな方法がないかどうかを確認します。

于 2012-07-26T17:28:32.823 に答える
0
if exists(select * from YourTable WHERE A=6)
  select * from YourTable WHERE A=6
else
  select * from YourTable WHERE A<0
于 2012-07-26T17:25:25.053 に答える