Asp.net SQL中使用Case语句的级联下拉列表

Asp.net SQL中使用Case语句的级联下拉列表,asp.net,sql,sql-server,tsql,Asp.net,Sql,Sql Server,Tsql,我有一个前端应用程序,用户可以从下拉框中选择城市名称或从另一个下拉框中选择州名称。如果用户从“状态”下拉列表中选择“全部”,则查询应返回所有状态,城市也是如此。该表还有其他信息,如邮政编码,因此查询应始终根据用户选择返回结果。这个表非常大,大约超过10万行,所以我希望查询在检查条件时能够高效地执行。这个查询的问题是,如果我从“州”下拉列表中选择“加利福尼亚”,而我想从“城市”下拉列表中选择“洛杉矶”,那么查询将不起作用。请帮忙。谢谢 这是我的密码: SET ANSI_NULLS ON GO SE

我有一个前端应用程序,用户可以从下拉框中选择城市名称或从另一个下拉框中选择州名称。如果用户从“状态”下拉列表中选择“全部”,则查询应返回所有状态,城市也是如此。该表还有其他信息,如邮政编码,因此查询应始终根据用户选择返回结果。这个表非常大,大约超过10万行,所以我希望查询在检查条件时能够高效地执行。这个查询的问题是,如果我从“州”下拉列表中选择“加利福尼亚”,而我想从“城市”下拉列表中选择“洛杉矶”,那么查询将不起作用。请帮忙。谢谢 这是我的密码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [MJX].[spx_Get_SL]
      @Filter_State VARCHAR(50),
      @Filter_City VARCHAR(50)
AS
BEGIN
      SET NOCOUNT ON;

      IF @Filter_State <> 'ALL' 
            SELECT * FROM myTable  WHERE State = @Filter_State

   ELSE IF  @Filter_City <> 'ALL'
        SELECT * from myTable WHERE City=@Filter_City

      ELSE
        SELECT * from myTable
END

应将参数值组合到单个查询中:

select * from myTable 
Where (City = @FilterCity or @FilterCity = 'ALL') 
and (State = @FilterState or @FilterState = 'ALL')
一个更为首选的选项,可避免参数嗅探并稍微优化查询:

ALTER PROCEDURE [MJX].[spx_Get_SL]
      @Filter_State VARCHAR(50),
      @Filter_City VARCHAR(50)
AS

BEGIN

DECLARE @LocFilter_State VARCHAR(50);
DECLARE @LocFilter_Cty VARCHAR(50);

SELECT @LocFilter_State = CASE WHEN @Filter_State = 'ALL' THEN NULL else @Filter_State END;
SELECT @LocFilter_City = CASE WHEN @Filter_City = 'ALL' THEN NULL else @Filter_City END;

SELECT * from MyTable Where City = ISNULL(@LocFilter_City,City) AND State = ISNULL(@LocFilter_State,State);

END
您可以在Where子句中使用大小写来实现这一点。因此,我检查变量的值,然后选择适当的列或传递1

SELECT *
FROM myTable
WHERE CASE 
        WHEN @Filter_State <> 'ALL'
            THEN STATE
        ELSE 1
        END = CASE 
        WHEN @Filter_State <> 'ALL'
            THEN @Filter_State
        ELSE 1
        END
    AND CASE 
        WHEN @Filter_City <> 'ALL'
            THEN City
        ELSE 1
        END = CASE 
        WHEN @Filter_City <> 'ALL'
            THEN @Filter_City
        ELSE 1
        END
您需要更多的if's,if St=ALL和City=ALL St=ALL和CityALL StALL和City=ALL StALL和CityALL,并且每种情况都有不同的行为。