【问题标题】:Select column with values greater 0选择值大于 0 的列
【发布时间】:2013-11-07 08:08:16
【问题描述】:

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

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

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。

在此先感谢,并为我糟糕的英语感到抱歉。

【问题讨论】:

  • 当返回多行时,您希望这会如何表现,有些是Cold = 0,有些是Cold > 0?您不能使用 select 语句返回锯齿状数组...
  • 不会有多行。每次只有一排。
  • 图片丢失 - 您能否编辑您的问题并使用编辑器的图片上传器上传它们?
  • 我下班回家后会重新上传。

标签: sql-server-2008


【解决方案1】:

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

但是您可以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

【讨论】:

  • 这就是这样做的方法。唯一的区别是我会把它放在一个程序中。封装它并使其更快。
  • @Dave:好点。实际上,我什至没有想过要明确说明这可以/应该放入存储过程中,可能是因为 OP 已经声明他们打算编写一个,而我只是专注于 SP 应该做什么的本质。然而,你提出这一点是对的,因为尽可能让自己清楚一点是没有坏处的。所以我现在添加了完整的 SP 定义。
【解决方案2】:

您必须为结果集中的每一行/列返回一个“值”。如果您不想获取 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 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2020-03-12
    • 2020-07-05
    • 1970-01-01
    • 2023-04-06
    • 2016-01-16
    相关资源
    最近更新 更多