Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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/7/sql-server/27.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 CASE开关_Sql_Sql Server_Tsql - Fatal编程技术网

参数的SQL CASE开关

参数的SQL CASE开关,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个参数,可以是3个可能值0、2或NULL中的1个(这些是枚举的值,0处于挂起状态,1处于审核中,2处于关闭状态)。如果为空,则应检索所有,无论状态如何;如果为2,则应检索所有已关闭的文件;但是,如果值为0,则应检索挂起或正在审查的文件。最后一个表示我要检索状态为0或1的记录。到目前为止,我有以下代码,并尝试使用CASE开关,但它不起作用 SELECT * FROM PurchaseOrder WHERE (CreationDate >= @StartDate AND Crea

我有一个参数,可以是3个可能值0、2或NULL中的1个(这些是枚举的值,0处于挂起状态,1处于审核中,2处于关闭状态)。如果为空,则应检索所有,无论状态如何;如果为2,则应检索所有已关闭的文件;但是,如果值为0,则应检索挂起或正在审查的文件。最后一个表示我要检索状态为0或1的记录。到目前为止,我有以下代码,并尝试使用CASE开关,但它不起作用

SELECT * FROM PurchaseOrder
    WHERE (CreationDate >= @StartDate AND CreationDate <= @EndDate)
    AND (@POStatus IS NULL OR [Status] = @POStatus)
    AND (@POStatus IS NULL OR [Status] = CASE @POStatus WHEN 0 THEN 1 END)
    AND (@PurchaseOrderIdSearch IS NULL OR PurchaseOrderId LIKE @PurchaseOrderIdSearch)
    AND EmployeeId = @EmployeeId
    ORDER BY CreationDate DESC, PurchaseOrderId DESC
从PurchaseOrder中选择*

其中(CreationDate>=@StartDate和CreationDate=@StartDate和CreationDate=@StartDate和CreationDate我想你在寻找类似的东西

DECLARE @MyParam INT; --Try to set 0, 1 or 2 

SELECT *
FROM
(
  VALUES
  (0),
  (1),
  (2)
) T(Value)
WHERE (Value = @MyParam) OR (@MyParam IS NULL);
下面是一个例子,看看它是如何工作的


更新:

看起来你在找

DECLARE @MyParam INT; --Try to set 0, 1 or 2 

SELECT *
FROM
(
  VALUES
  (0),
  (1),
  (2)
) T(Value)
WHERE 
(
  CASE WHEN @MyParam = 0 OR @MyParam = 1 THEN 1 ELSE 0 END = 1
  AND Value IN(0, 1)
)
OR
(Value = @MyParam AND @MyParam = 2)
OR 
@MyParam IS NULL;

这里有一个

如果你不提供上下文,就永远不会有好结果——没有上下文,任何建议都可能导致你走上错误的道路。这里有一个语句和“参数”但不清楚此语句在应用程序/数据库关系中的确切位置。如果您的应用程序包含此语句,则最好动态添加所需的逻辑以允许更简单的参数化。否则,Erland将非常详细地讨论此问题,其中列=2…哪列?您的查询在哪里ause比您描述的需求更复杂。逻辑似乎是
…其中…和(@POSStatus为NULL)或(@POSStatus=0和(0,1)中的未指定列)或(@POSStatus=2和未指定列=2))
。正如Erland解释的那样,它可能受益于
选项(重新编译)
DECLARE @MyParam INT; --Try to set 0, 1 or 2 

SELECT *
FROM
(
  VALUES
  (0),
  (1),
  (2)
) T(Value)
WHERE 
(
  CASE WHEN @MyParam = 0 OR @MyParam = 1 THEN 1 ELSE 0 END = 1
  AND Value IN(0, 1)
)
OR
(Value = @MyParam AND @MyParam = 2)
OR 
@MyParam IS NULL;