用于在同一列上使用3个可选参数过滤数据的SQL查询

时间:2018-01-19 09:36:09

标签: sql sql-server stored-procedures

假设我的表有一个列ProfileID&我想用ProfileID过滤。 在存储过程中,我发送@ PageID,@ GroupID,@ ChannelID (所有3个参数都是可选的,如果没有发送,那么这些值默认为0)来存档实际上是ProfileID的数据。所以实际上我想用 WHERE ProfileID IN(@ PageID,@ GroupID,@ ChannelID)过滤数据但是如果所有3个参数都是0那么我不会过滤任何东西。我会过滤if& amp ;仅当至少1个参数> 0

表结构

+--------+-----------------+---------------------+
| PostID | PostDescription | PostType  ProfileID |
+--------+-----------------+---------------------+
|  25151 | Messed up       | S         117       |
|  25152 | Messed up       | S         116       |
|  25153 | Messed up       | S         119       |
|  25154 | Messed up       | S         11        |
|  25155 | Messed up       | S         16        |
|  25157 | Messed up       | S         23        |
|  25158 | Messed up       | S         22        |
|  25159 | Messed up       | S         7         |
|        |                 |                     |
+--------+-----------------+---------------------+

示例案例

  1. @ PageID = 117,@ GroupID = 116,@ ChannelID = 16应返回带有profileID的行 IN(117,116,16)
  2. @ PageID = 0,@ GroupID = 0,@ ChannelID = 11应返回profileID = 11的行
  3. @ PageID = 117,@ GroupID = 0,@ ChannelID = 11应该返回带有profileID IN(117,11)的行
  4. @ PageID = 0,@ GroupID = 0,@ ChannelID = 0应返回所有行而不进行过滤。
  5. 如何使用WHERE条件实现此目的?

1 个答案:

答案 0 :(得分:2)

只需使用or

WHERE ProfileID IN(@PageID,@GroupID,@ChannelID )
   OR COALESCE(@PageID,@GroupID,@ChannelID) is null

如果参数为null,则上面为0

WHERE ProfileID IN(@PageID,@GroupID,@ChannelID )
   OR (@PageID = 0 AND @GroupID = 0 AND @ChannelID = 0)