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