0

.NET ページのグリッドに大量のデータを提供する T-SQL ストアド プロシージャがあります。そのため、ページの上部に「0 ~ 9」と各文字の選択肢を配置しました。ユーザーが文字をクリックしたときに、その最初の文字で始まる結果に基づいて結果をフィルタリングしたいようにします。製品名を使用しているとしましょう。したがって、ユーザーが「A」をクリックした場合、ストアド プロシージャのみが SUBSTRING(ProductName, 1, 1) = 「A」の結果を返すようにします。

私が困っているのは、数字で始まる製品名です。その場合、ISNUMERIC(SUBSTRING(ProductName, 1, 1)) = 1 のすべての ProductName 値をフェッチしたいと考えています。@FL という入力パラメータを使用しています。@FL はゼロになります (数値で始まる製品はほとんどないため、このようにひとまとめにします)。

もちろん WHERE SUBSTRING(ProductName, 1, 1) IN ('0', '1', '2'.....) という代替案もありますが、それでも CASE 文を考案できたことがありません。これは、一方の評価で = を実行し、もう一方の評価で IN ステートメントを実行します。

WHERE 句の CASE 部分の proc にあるものを次に示します。動作しませんが、疑似コードの観点からのみ価値がある場合があります。

アイデアをお寄せいただきありがとうございます。

AND CASE @FL
    WHEN "0" THEN
    CASE WHEN @FL = "0" THEN
        isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1
    ELSE
        SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL            
    END
END

*** この CASE ステートメントの使用が「非標準」であることはわかっていますが、オンラインで見つけて、何らかの見込みがあると考えました。しかし、単一の CASE ステートメントを使用しようとすると、同じ結果が得られました (「=」付近のエラー)。

4

3 に答える 3

1

Like 演算子を使用しないのはなぜですか?

   Where dbo.AssnCtrl.Name Like @FL + '%' 

Any Number オプションを選択する場合は、@FL を「[0-9]」として渡します。

(この名前列にインデックスがあると思いますか?)

于 2010-09-10T21:05:43.383 に答える
1

チャールズから少し盗むには:

AND Substring(dbo.AssnCtrl.Name, 1, 1) Like
  CASE WHEN @FL = '0' THEN '[0-9]'
    ELSE @FL            
  END
于 2010-09-10T21:14:20.987 に答える
0

やってみました

AND (
        isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1
    or
        SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL    )

これは私のために働く:

select * from casefile where
isnumeric(substring(pmin,1,1)) = 1
or 
substring(pmin,1,1) = 'a'
于 2010-09-10T21:22:21.917 に答える