选择值大于0的列

时间:2012-01-25 14:44:44

标签: sql-server-2008

我有一个包含8个表的项目数据库。在那里,我想编写一个存储过程来为指定的项ID选择所有大于0的值。 我现在的问题是只返回指定项的值大于0的列的语句。

基本上我写了一个简单的select,返回以下数据:

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

当“Cold”列现在包含0值时,它返回与上面相同的结构,但Cold是0而不是120.

但是如果Cold的值是0,我不想得到这个列并丢弃它,我只得到剩下的值:

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

我正在使用MSSQL Management Studio 2008,数据库是2008 R2。

提前致谢,抱歉我的英语不好。

2 个答案:

答案 0 :(得分:3)

查询应该返回固定列。没有语法允许您仅有条件地返回某些列。

但是可以IF语句的帮助下调用条件查询。因此,您可以先检查您要检索的行是否在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

答案 1 :(得分: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 ...