Sql server 2008 如何获得一个;“已搜索案例表达式”;在SQL Server 2008中,返回搜索条件而不是结果表达式

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

我试图在WHERE子句中使用带有“”的CASE语句应用条件逻辑,该语句返回一个表达式,但它不起作用,因为它需要一个“”来代替。见下文

如何在WHERE子句中使用“Searched CASE expression”并使其返回“Search Condition”

在哪里
(
--用户提供最低和最高价格
案例
当(@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
)