1

次のデータ構造があります。

P_ID    EVSSMIN EVSSMAX TDMIN   TDMAX   WARD    SYRINGE_ID   COMBINE_WITH   CUSTOM_CONCENTRATION
1003    0   20  125 250 2ZKG    1021038
    44444444    5
1003    20  60  125 250 2ZKG    1021037
    44444444    5

通常、結果には次のクエリを使用しています。

[クエリ 1]

SELECT * 
FROM [definities] 
WHERE 160 BETWEEN [TDMIN] AND [TDMAX] AND [WARD] = '2ZKG' AND [P_ID]=` 1003;

テーブルの最後の列には、0 より大きい値を含めることができます。それより大きい値は 5 です。

通常、上記のクエリの代わりに以下のクエリを実行します。

[クエリ 2]

SELECT * FROM [definities] 
WHERE 160 BETWEEN [TDMIN] AND [TDMAX] 
AND CAST(160 as decimal) / [CUSTOM_CONCENTRATION]) BETWEEN EVSSMIN AND EVSMAX 
AND [WARD] = '2ZKG' -- AND [P_ID]= 1003;

ご覧のとおり、クエリは値 160 を [CUSTOM_CONCENTRATION]) 値で割って計算しています。EVVSMIN と EVSSMAX の間で一致し、値 160 は TDMIN と TDMAX の間で一致します。通常、[CUSTOM_CONCENTRATION] 列に 0 より大きい値が含まれている場合、クエリ 2 は適切に機能します。

問題は、[CUSTOM_CONCENTRATION] 列に 0 より大きい値が含まれていない場合、クエリでレコードを返すことができないことです。これは、クエリを変更するか、[CUSTOM_CONCENTRATION] 値に基づいて何かを変更する必要があることを意味します。これは C# コード内で解決できますが、if ステートメントで反復してチェックする必要がある複数のレコードではなく、値に基づいて正確なレコードを返すクエリとしてこれを行うことができます。

4

2 に答える 2

1

[CUSTOM_CONCENTRATION]値がゼロ以下のときに最初のクエリが必要で、それ以外の場合は2番目のクエリが必要であるとするUNION ALLと、両方のクエリに別の制限を付けてを使用できます。

SELECT * FROM [definities] 
WHERE 160 BETWEEN [TDMIN] AND [TDMAX] AND [WARD] = '2ZKG' AND [P_ID]=` 1003
AND [CUSTOM_CONCENTRATION] <= 0

UNION ALL

SELECT * FROM [definities] 
WHERE 160 BETWEEN [TDMIN] AND [TDMAX] 
AND CAST(160 as decimal) / [CUSTOM_CONCENTRATION]) BETWEEN EVSSMIN AND EVSMAX 
AND [WARD] = '2ZKG' -- AND [P_ID]= 1003
AND [CUSTOM_CONCENTRATION] > 0;

別の解決策、そしてよりエレガントな解決策は次のとおりです。

SELECT * FROM [definities] 
WHERE 160 BETWEEN [TDMIN] AND [TDMAX] AND [WARD] = '2ZKG'
AND (([P_ID]=` 1003
      AND [CUSTOM_CONCENTRATION] <= 0)
     OR
     (CAST(160 as decimal) / [CUSTOM_CONCENTRATION]) BETWEEN EVSSMIN AND EVSMAX
      AND AND [CUSTOM_CONCENTRATION] > 0));
于 2012-06-21T08:34:57.173 に答える
1

多分このようなもの:

SELECT * FROM [definities] WHERE 160 BETWEEN [TDMIN] AND [TDMAX] AND
 ( case when [CUSTOM_CONCENTRATION] = 0 then EVSSMIN 
         else CAST(160 as decimal) / [CUSTOM_CONCENTRATION]) end
            BETWEEN EVSSMIN AND EVSMAX )
         AND [WARD] = '2ZKG'
于 2012-06-21T08:38:09.267 に答える