Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
SQL:如何根据传递的参数有条件地调整WHERE子句,并且仍然使用UNION_Sql_Stored Procedures_Parameters_Union_Where Clause - Fatal编程技术网

SQL:如何根据传递的参数有条件地调整WHERE子句,并且仍然使用UNION

SQL:如何根据传递的参数有条件地调整WHERE子句,并且仍然使用UNION,sql,stored-procedures,parameters,union,where-clause,Sql,Stored Procedures,Parameters,Union,Where Clause,我对SQL相当缺乏经验。我正在使用SQL Server 2012 基本上,我希望根据传递给存储过程的某些参数的值来调整SQL SELECT语句的WHERE子句 我还将把这个SELECT的结果与存储过程中的另一个SELECT语句联合起来 目前的结构如下: CREATE PROCEDURE dbo.procMyProcedure @Param1 smallint = null , @Param2 int = null , ... AS ... --I have three separa

我对SQL相当缺乏经验。我正在使用SQL Server 2012

基本上,我希望根据传递给存储过程的某些参数的值来调整SQL SELECT语句的WHERE子句

我还将把这个SELECT的结果与存储过程中的另一个SELECT语句联合起来

目前的结构如下:

CREATE PROCEDURE dbo.procMyProcedure
  @Param1 smallint = null
  , @Param2 int = null
  , ...
AS ...

--I have three separate SELECT statements, each catering for a specific scenario

    SELECT ...
    FROM ...
    WHERE
        (ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND 
        (EE.EME_Number = ISNULL(@Param2, EE.EME_Number))

    SELECT ...
    FROM ...
    WHERE
        (EE.EME_Number = ISNULL(@Param2, EE.EME_Number))

    SELECT ...
    FROM ...
    WHERE
        (ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number))
除了WHERE子句外,这些语句是相同的。在我的场景中,第一条语句正好返回1个结果。第二个返回119个结果。第三个返回3个结果

我不想运行这三个语句。我想将它们合并到一个语句中,根据传递的(可选)参数的值,该语句返回与上述三个语句相同的结果

如果。。。否则,如果是结构,那么我就不能使用并集。以下结构不起作用:

    IF ...
        SELECT ...
    ELSE IF ...
        SELECT ...
    ELSE IF ...
        SELECT ...
UNION
    SELECT ...
必须有一种方法将它们合并到一个SELECT语句中,这样我就可以将它用作UNION语句的一部分

我想谈以下几点:

SELECT ... --This select
UNION
SELECT ... --Other stuff
我真的很感谢你在这方面的帮助

问候,


Adam。

如果emr\u编号和eme\u编号不可为空,只需使用OR而不是and运行第一个查询即可。我已经想出了解决我问题的办法。它涉及到一些布尔逻辑和一些空值的使用以及相当数量的方括号

这是我一直在寻找的WHERE条款:

WHERE
    ((ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND 
     (EE.EME_Number = ISNULL(@Param2, EE.EME_Number)))
    OR 
    ((ER.EMR_Number = ISNULL(@Param1, NULL)) AND 
     (EE.EME_Number = ISNULL(@Param2, EE.EME_Number)))
    OR
    ((ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND 
     (EE.EME_Number = ISNULL(@Param2, NULL)))
它给出了我期望的确切结果,我仍然可以在UNION语句中使用查询

当然,可能有一个更优雅的解决方案。如果是,请邮寄


-Adam。

在我的场景中,运行第一个查询只返回1个结果。运行第二个查询将返回119个结果。运行第三个查询将返回3个结果。它们是3种不同的场景。