【问题标题】:Remove row from SELECT based on column value根据列值从 SELECT 中删除行
【发布时间】:2014-02-26 04:44:14
【问题描述】:

我有一个复杂的存储过程,我需要能够隐藏连接到主表的表中的特定行。隐藏这一行的标准是基于主表(Orders)中的值(DeductMoney)是否为1。我的存储过程是这样的:

SELECT 
  O.FileNumber
  ,ML.Line
  ,ML.Price
  ,ML.Description
FROM Orders O
INNER JOIN Main M 
  ON O.OrdersID = M.OrdersID 
INNER JOIN MainLine ML
  ON ML.MainID = M.MainID
WHERE 
  M.MainID = @MainID

结果集目前如下所示:

FileNumber | Line | Price | Description
---------------------------------------
0001       | 501  | $200  | DescriptionA
0001       | 502  | $300  | DescriptionB
0001       | 503  | $150  | DescriptionC
0001       | 504  | $100  | DescriptionD
0001       | 505  | $75   | DescriptionE
0001       | 506  | $500  | DescriptionF

现在 Orders 表中有一个名为 DeductMoney 的列。此列仅适用于返回结果集的一个特定行,即第 506 行。DeductMoney 列可以是 0 或 1,如果是 1,我需要从 SQL SELECT 中完全删除该行。所以本质上,如果 DeductMoney = 1,则删除第 506 行存在的行。

很遗憾,此数据没有传递给 SSRS,因此我无法在该级别对其进行过滤。有人对我将如何执行此操作有想法吗?是否可以通过 CASE 语句来做到这一点?非常感谢任何帮助!

根据列值从 SELECT 中删除行

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您需要在where 子句中添加逻辑:

    WHERE M.MainID = @MainID AND
          NOT (Line = 506 and DeductMoney = 1)
    

    【讨论】:

    • 我写了同样的答案......但如果你真的需要用 CASE 语句来做:WHERE M.MainID = @MainID AND CASE WHEN ML.Line = 506 AND DeductMoney = 1 THEN 0 ELSE 1 结束 = 1
    • 哇,这么简单的事情我完全忽略了。哈!谢谢你帮我放屁。
    【解决方案2】:

    这不起作用,还是我误读了什么?

    SELECT 
      O.FileNumber
      ,ML.Line
      ,ML.Price
      ,ML.Description
    FROM Orders O
    INNER JOIN Main M 
      ON O.OrdersID = M.OrdersID 
    INNER JOIN MainLine ML
      ON ML.MainID = M.MainID
    WHERE 
      M.MainID = @MainID
      AND DeductMoney <> 1
    

    【讨论】:

    • 由于 DeductMoney 会出现在每一行,它会完全省略所有结果。
    • 不好意思,我误会了,不知道每次都是506行。
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2019-02-24
    • 2023-04-08
    • 2021-06-23
    相关资源
    最近更新 更多