Sql server 2008 如何获得一个;“已搜索案例表达式”;在SQL Server 2008中,返回搜索条件而不是结果表达式
我试图在WHERE子句中使用带有“”的CASE语句应用条件逻辑,该语句返回一个表达式,但它不起作用,因为它需要一个“”来代替。见下文 如何在WHERE子句中使用“Searched CASE expression”并使其返回“Search Condition”Sql server 2008 如何获得一个;“已搜索案例表达式”;在SQL Server 2008中,返回搜索条件而不是结果表达式,sql-server-2008,tsql,case,where-clause,Sql Server 2008,Tsql,Case,Where Clause,我试图在WHERE子句中使用带有“”的CASE语句应用条件逻辑,该语句返回一个表达式,但它不起作用,因为它需要一个“”来代替。见下文 如何在WHERE子句中使用“Searched CASE expression”并使其返回“Search Condition” 在哪里 ( --用户提供最低和最高价格 案例 当(@MIN_PRICE不为空,@MAX_PRICE不为空,@MIN_PRICE>0,@MAX_PRICE>0)时 案例 当列表状态为“已售出”时,则 售价介于@MIN_PRICE和@MAX_P
在哪里
(
--用户提供最低和最高价格
案例
当(@MIN_PRICE不为空,@MAX_PRICE不为空,@MIN_PRICE>0,@MAX_PRICE>0)时
案例
当列表状态为“已售出”时,则
售价介于@MIN_PRICE和@MAX_PRICE之间
否则——积极的和偶然的
案例
当VALUE\u RANGE\u PRICING=否时,则
列出@MIN_PRICE和@MAX_PRICE之间的价格
ELSE——价格范围
最低价格和最高价格之间的低标价
或
列出@MIN_PRICE和@MAX_PRICE之间的价格
结束
结束
--用户只提供最高价格
当(@MIN_PRICE为NULL或@MIN_PRICE=0)且@MAX_PRICE不为NULL且@MAX_PRICE>0)时,则
案例
当列表状态为“已售出”时,则
售价=@MIN\u价格
ELSE——价格范围
价格清单>=@MIN\u价格
结束
结束
--否则{不做任何事}因为没有提供最低/最高价格
结束
)
我认为以下功能应该是等效的
这假设使用的值属于MONEY
数据类型…如果不是,您可以将此处使用的最小/最大值调整为所使用数据类型的值
-- First, set the min / max magic numbers for the MONEY data type.
DECLARE
@MinMoney MONEY,
@MaxMoney MONEY
SET @MinMoney = -922,337,203,685,477.5808
SET @MaxMoney = 922,337,203,685,477.5807
-- Then later in your query...
WHERE
(
CASE
-- First, handle the "no parameters supplied scenario" by returning NULL,
-- which will cause the following check to fail.
WHEN @MIN_PRICE IS NULL AND @MAX_PRICE IS NULL THEN NULL
-- Next, supply the values for the various statuses.
WHEN LIST_STATUS = 'Sold' THEN SOLD_PRICE
WHEN VALUE_RANGE_PRICING = 'No' THEN LIST_PRICE_H
ELSE LOW_LIST_PRICE
-- Lastly, check if the supplied value falls within the range.
-- If a value isn't supplied, convert it to either the min or max value.
END BETWEEN
ISNULL(NULLIF(@MIN_PRICE, 0), @MinMoney)
AND ISNULL(NULLIF(@MAX_PRICE, 0), @MaxMoney)
)
您需要将布尔表达式转换为整数,1表示true,0表示false,然后将它们与1进行比较以再次获得布尔值。您可以在表达式结束时说
case,然后说1 else 0
大概是这样的:
where
case
when situation1 then
case when condition1 then 1
else 0
end
when situation2 then
case when conditon2 then 1
else 0 end
else 0 end
= 1
在您的示例中:
像这样:
WHERE
(
--user supplies both min and max price
CASE
WHEN (@MIN_PRICE IS NOT NULL AND @MAX_PRICE IS NOT NULL AND @MIN_PRICE > 0 AND @MAX_PRICE > 0) THEN
CASE
WHEN LIST_STATUS = 'Sold' THEN
case when SOLD_PRICE BETWEEN @MIN_PRICE AND @MAX_PRICE then 1 else 0 end
ELSE --Active and Contingent
CASE
WHEN VALUE_RANGE_PRICING = 'No' THEN
case when LIST_PRICE_H BETWEEN @MIN_PRICE AND @MAX_PRICE then 1 else 0 end
ELSE --Price Range
case when
LOW_LIST_PRICE BETWEEN @MIN_PRICE AND @MAX_PRICE
OR
LIST_PRICE_H BETWEEN @MIN_PRICE AND @MAX_PRICE
then 1 else 0 end
END
END
--user supplies just max price
WHEN ((@MIN_PRICE IS NULL OR @MIN_PRICE = 0) AND @MAX_PRICE IS NOT NULL AND @MAX_PRICE > 0) THEN
CASE
WHEN LIST_STATUS = 'Sold' THEN
case when SOLD_PRICE <= @MAX_PRICE then 1 else 0 end
ELSE --Active and Contingent
CASE
WHEN VALUE_RANGE_PRICING = 'No' THEN
case when SEARCH_PRICE <= @MAX_PRICE then 1 else 0 end
ELSE --Price Range
case when LOW_LIST_PRICE <= @MAX_PRICE then 1 else 0 end
END
END
--user supplies just min price
WHEN ((@MAX_PRICE IS NULL OR @MAX_PRICE = 0) AND @MIN_PRICE IS NOT NULL AND @MIN_PRICE > 0) THEN
CASE
WHEN LIST_STATUS = 'Sold' THEN
case when SOLD_PRICE >= @MIN_PRICE then 1 else 0 end
ELSE --Active and Contingent
CASE
WHEN VALUE_RANGE_PRICING = 'No' Then
case when SEARCH_PRICE >= @MIN_PRICE then 1 else 0 end
ELSE --Price Range
case when LIST_PRICE_H >= @MIN_PRICE then 1 else 0 end
END
END
--else {do nothing} as no min/max prices supplied
END
= 1
)
在哪里
(
--用户提供最低和最高价格
案例
当(@MIN_PRICE不为空,@MAX_PRICE不为空,@MIN_PRICE>0,@MAX_PRICE>0)时
案例
当列表状态为“已售出”时,则
当卖出价格在@MIN_价格和@MAX_价格之间时,则为1,否则为0结束
否则——积极的和偶然的
案例
当VALUE\u RANGE\u PRICING=否时,则
当标价在@MIN\u PRICE和@MAX\u PRICE之间时,则为1,否则为0
ELSE——价格范围
当
最低价格和最高价格之间的低标价
或
列出@MIN_PRICE和@MAX_PRICE之间的价格
然后1或0结束
结束
结束
--用户只提供最高价格
当(@MIN_PRICE为NULL或@MIN_PRICE=0)且@MAX_PRICE不为NULL且@MAX_PRICE>0)时,则
案例
当列表状态为“已售出”时,则
销售价格=@MIN\u价格时的案例,然后1其他0结束
ELSE——价格范围
当列表价格>=@MIN\u价格然后1其他0结束时的情况
结束
结束
--否则{不做任何事}因为没有提供最低/最高价格
结束
= 1
)
你应该仔细阅读这篇文章,看看是否有打字错误
另外,请注意,这不会使用任何索引。要使用索引,您可以将其分解为联合或使用临时表。我意识到这不是最佳方法,因此欢迎使用更好的方法。我们只是试图避免编写一系列级联查询并组合结果。虽然这会将案例表达式结果转化为搜索条件,但关于WHERE子句中的可用性,我不知道它如何帮助解决所讨论的sql问题。所有条件都返回1,使它们彼此无法区分。我想您可以为其中的每个条件结果分配不同的数字,但我不确定在外壳表达式的末尾该如何工作。@johntrepreneur,如果为真,则所有条件返回1,如果为假,则返回0,但每个条件仅在外壳的相关分支为真时才进行计算。因此,如果所选条件为真,则外壳返回1,否则返回0。因此,只需将表达式与1进行比较,以查看所选条件是否为真…@johntepreneur,我假定你不想知道正确的条件已被计算,是吗?不想输出一个包含条件文本的字符串?Ben,你是对的,因为我不需要知道哪个条件已被执行,只是至少有一个条件已匹配,因此,该记录将被包括在结果集中。毕竟,它是一个ERE子句用于确定记录是否符合这些条件,我将通过应用上面的1=1逻辑得到这些条件。不确定为什么我昨天没有看到这些。谢谢,它现在可以工作了。不错,我喜欢(+1).我也喜欢你根据所有相似的逻辑将它压缩了很多,但是你没有解决第一-价格范围部分下三个主要模块中第一个模块中的一个或条件。当原始逻辑是LOW\u LIST\u Price或LIST\u Price\u H产生匹配时,你只说了“ELSE LOW\u LIST\u Price”。如何处理?
WHERE
(
--user supplies both min and max price
CASE
WHEN (@MIN_PRICE IS NOT NULL AND @MAX_PRICE IS NOT NULL AND @MIN_PRICE > 0 AND @MAX_PRICE > 0) THEN
CASE
WHEN LIST_STATUS = 'Sold' THEN
case when SOLD_PRICE BETWEEN @MIN_PRICE AND @MAX_PRICE then 1 else 0 end
ELSE --Active and Contingent
CASE
WHEN VALUE_RANGE_PRICING = 'No' THEN
case when LIST_PRICE_H BETWEEN @MIN_PRICE AND @MAX_PRICE then 1 else 0 end
ELSE --Price Range
case when
LOW_LIST_PRICE BETWEEN @MIN_PRICE AND @MAX_PRICE
OR
LIST_PRICE_H BETWEEN @MIN_PRICE AND @MAX_PRICE
then 1 else 0 end
END
END
--user supplies just max price
WHEN ((@MIN_PRICE IS NULL OR @MIN_PRICE = 0) AND @MAX_PRICE IS NOT NULL AND @MAX_PRICE > 0) THEN
CASE
WHEN LIST_STATUS = 'Sold' THEN
case when SOLD_PRICE <= @MAX_PRICE then 1 else 0 end
ELSE --Active and Contingent
CASE
WHEN VALUE_RANGE_PRICING = 'No' THEN
case when SEARCH_PRICE <= @MAX_PRICE then 1 else 0 end
ELSE --Price Range
case when LOW_LIST_PRICE <= @MAX_PRICE then 1 else 0 end
END
END
--user supplies just min price
WHEN ((@MAX_PRICE IS NULL OR @MAX_PRICE = 0) AND @MIN_PRICE IS NOT NULL AND @MIN_PRICE > 0) THEN
CASE
WHEN LIST_STATUS = 'Sold' THEN
case when SOLD_PRICE >= @MIN_PRICE then 1 else 0 end
ELSE --Active and Contingent
CASE
WHEN VALUE_RANGE_PRICING = 'No' Then
case when SEARCH_PRICE >= @MIN_PRICE then 1 else 0 end
ELSE --Price Range
case when LIST_PRICE_H >= @MIN_PRICE then 1 else 0 end
END
END
--else {do nothing} as no min/max prices supplied
END
= 1
)