Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一列上使用3个可选参数筛选数据的SQL查询_Sql_Sql Server_Stored Procedures - Fatal编程技术网

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

在同一列上使用3个可选参数筛选数据的SQL查询,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,假设我的表有一个列ProfileID&我想用ProfileID进行筛选。 在存储过程中,我发送@PageID、@GroupID、@ChannelID(所有3个参数都是可选的,如果不发送,那么这些值默认为0)以过滤出实际为ProfileID的数据。因此,实际上我想用WHERE ProfileID(@PageID、@GroupID、@ChannelID)过滤数据但如果所有3个参数均为0,则我将不过滤任何内容。我将过滤当且仅当至少1个参数大于0时 表结构 +--------+-------------

假设我的表有一个列ProfileID&我想用ProfileID进行筛选。 在存储过程中,我发送@PageID、@GroupID、@ChannelID(所有3个参数都是可选的,如果不发送,那么这些值默认为0)以过滤出实际为ProfileID的数据。因此,实际上我想用WHERE ProfileID(@PageID、@GroupID、@ChannelID)过滤数据但如果所有3个参数均为0,则我将不过滤任何内容。我将过滤当且仅当至少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         |
|        |                 |                     |
+--------+-----------------+---------------------+
  • @PageID=117、@GroupID=116、@ChannelID=16应返回具有profileID的行 IN(117116,16)
  • @PageID=0、@GroupID=0、@ChannelID=11应返回profileID=11的行
  • @PageID=117、@GroupID=0、@ChannelID=11应在(117,11)中返回profileID为的行
  • @PageID=0、@GroupID=0、@ChannelID=0应返回所有行而不进行筛选

  • 在WHERE条件下如何实现这一点?

    只需使用

    WHERE ProfileID IN(@PageID,@GroupID,@ChannelID )
       OR COALESCE(@PageID,@GroupID,@ChannelID) is null
    
    如果参数为空,如果参数为
    0
    ,则在上面:

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

    只需使用

    WHERE ProfileID IN(@PageID,@GroupID,@ChannelID )
       OR COALESCE(@PageID,@GroupID,@ChannelID) is null
    
    如果参数为空,如果参数为
    0
    ,则在上面:

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

    您可以为此使用
    大小写
    构造。添加所有这些参数,并检查其是否大于0,我猜它们都是int数据类型,因此,在@PageID+@GroupID+@ChannelID>0处,您可以使用
    大小写
    构造。添加所有这些参数,并检查其是否大于0,我猜它们都是int数据类型,因此@PageID+@GroupID+@ChannelID>0处的0不为空。谢谢它的工作,我想。这很容易,但我很困惑该怎么办。lol.0不是空的。谢谢它的工作,我想。这很容易,但我很困惑该怎么办。英雄联盟