2012-01-25 4 views
2

私は8テーブルのアイテムデータベースを持っています。そこでは、指定されたアイテムIDに対して0より大きいすべての値を選択するストアドプロシージャを作成したかったのです。 私の問題は今、指定した項目の値は、基本的に私は、次のデータを返す簡単な選択を書き 値の大きい列を選択する0

0大きいカラムのみを返す文です:

Example 1 http://i.imagebanana.com/img/rhw2sm9u/1327501679.jpg

列 "Cold"には0の値が含まれていますが、上記と同じ構造を返しますが、Coldは120ではなく0になります。

Coldの値が0の場合、この列を取得せず、残りの値だけを取得する:

Example 2 http://i.imagebanana.com/img/dux1gyb8/1327502046.jpg

私はMSSQL Management Studio 2008を使用しており、データベースは2008 R2です。

おかげさまでありがとうございました。

+2

あなたはこれを期待するにはどうすればよいです複数の行が返されたときに動作します。いくつかは 'Cold = 0'で、いくつかは' Cold> 0'で動作しますか? selectステートメントでギザギザの配列を返すことはできません... – RedFilter

+0

複数の行はありません。たびに1行だけ。 – QQping

+0

画像が欠落しています - 質問を編集して、エディタの画像アップローダでアップロードできますか? –

答えて

3

列。 一部の列を条件付きで返すことを許可する構文はありません。

しかし、は、IFステートメントの助けを借りて条件に関するクエリを呼び出すことができます。したがって、まず検索する行に0以外の値が含まれているかどうかをColdに確認することができます。もしそうなら、あなたは他の列とColdを取得し、そうでない場合、あなたはそれを省略します。

IF EXISTS (SELECT * FROM YourTable WHERE ItemID = @ItemID AND Cold <> 0) 
    SELECT 
    ItemID, 
    ItemName, 
    Cold 
    FROM YourTable 
    WHERE ItemID = @ItemID 
ELSE 
    SELECT 
    ItemID, 
    ItemName 
    FROM YourTable 
    WHERE ItemID = @ItemID 

つまり、全体のストアドプロシージャの定義は次のようになります。

CREATE PROCEDURE YourStoredProcedure 
    @ItemID int 
AS 
BEGIN 
    IF EXISTS (SELECT * FROM YourTable WHERE ItemID = @ItemID AND Cold <> 0) 
    SELECT 
     ItemID, 
     ItemName, 
     Cold 
    FROM YourTable 
    WHERE ItemID = @ItemID 
    ELSE 
    SELECT 
     ItemID, 
     ItemName 
    FROM YourTable 
    WHERE ItemID = @ItemID 
END 
+0

これはこれを行う方法です。唯一の違いは、私はそれを手続きに入れることです。それをカプセル化し、より速くします。 – Dave

+0

@Dave:良い点。私は実際にも、それを明確に、これは/ OPはすでに1を書き込むように自分の意思を宣言していたためか、ストアドプロシージャの中に置くべきである可能性があり、私はちょうどSPは何をすべきかの本質に焦点を当てていることを行うことについて考えていませんでした。しかし、ポイントを上げるのは正しいです。できるだけ明確にすることは決して害ではないからです。だから私は今、完全なSPの定義を追加しました。 –

0

結果セットの各行/列に対して「値」を返す必要があります。あなたが0値を取得したくない場合は、のようなものを使用してNULLにそれらを回すことができます。

SELECT 
    NULLIF(YourCol1,0) AS YourCol1, NULLIF(YourCol2,0) AS YourCol2, .... 
    FROM ... 

またはクエリがの固定セットを返すことになっている

SELECT 
    CASE WHEN YourColumn1>0 THEN YourColumn1 ELSE 0 END AS YourColumn1, 
    CASE WHEN YourColumn2>0 THEN YourColumn2 ELSE 0 END AS YourColumn2, 
    ... 
    FROM ... 
関連する問題