0

多変数パラメーターに数学演算子と状況を含めることが可能かどうか疑問に思っています。

私の例では、@SLA_Days として「期限切れ」「1 日未満」または「1 日以上」を自由に入力できるようにしたいと考えています。

現在、これら 1 つの変数のいずれかを入力すると、結果が返されます。

if @sla_days = 'Overdue'
    BEGIN 
        SELECT @sql = @sql + 'and sla_days < 0' 
    END
ELSE

if @sla_days = 'Less than one day'
    BEGIN
        SELECT @sql = @sql + 'and sla_days <1 and sla_days >0'
    END
ELSE

if @sla_days = 'More than one day'
    BEGIN
        SELECT @sql = @sql + 'and sla_days > 1'
    END

EXEC sp_exectuesql @SQL

コンマ区切りの文字列を見て変数を引き出す関数を作成しました。これを作成するのに助けは必要ありません

助けが必要なのは、@SLA_days = 'Overdue,Less than one day,More than one day' と入力して、これらのルールを認識させることは可能ですか?

したがって、期限切れで 1 日未満を選択すると、sla_days < 0 と sla days < 1 の両方の値が返されます。

4

1 に答える 1

1

変数を引き出す関数は必要ありません。これにより、パフォーマンスが大幅に向上します。

特定の問題の秘訣は、列の値がANDになることはあり得ないため、OR代わりにを使用することです。また、条件を任意の順序で識別できるように、変数の両側にコンマを追加します。ただし、コンマの間にスペースがある場合も値が見つからないことに注意してください。そのために調整する必要があります。AND> 0< 0

SET @SLA_days = ',' + @SLA_days + ',';

SET @sql = @sql + ' (1=2 '
  + CASE WHEN @SLA_days LIKE '%,Overdue,%'
    THEN ' OR (sla_days < 0)' ELSE '' END
  + CASE WHEN @SLA_days LIKE '%,Less than one day,%'
    THEN ' OR (sla_days < 1 AND sla_days > 0)' ELSE '' END
  + CASE WHEN @SLA_days LIKE '%,More than one day,%'
    THEN ' OR (sla_days > 1)' ELSE '' END + ')';

最後に、これらの大きな醜い文字列をデータベースに渡す必要が本当にあるのでしょうか? おそらく、ユーザーは複数選択またはチェックボックスから選択しています。その場合、それぞれのケースを表すために、よりきちんとした係数を使用できます。

于 2013-03-25T16:39:37.853 に答える