Sql server 在案件陈述书中

Sql server 在案件陈述书中,sql-server,tsql,Sql Server,Tsql,我看过很多关于在WHERE子句中放入CASE语句的帖子。然而,在我的例子中,我想在case语句中放一个WHERE语句,我认为这是不可能的 我的情况是,我有一个在很多很多数据库上运行的视图。在其中的一半,我需要一个WHERE子句。在另一半中,我不需要WHERE子句。保留它并不有害,因为我不会得到坏数据,但它会大大降低查询速度,因为它必须在不必要时读取一个大表并对其进行排序 Status_Table ID Status 1 Active 2 Inactive 3 Unk

我看过很多关于在WHERE子句中放入CASE语句的帖子。然而,在我的例子中,我想在case语句中放一个WHERE语句,我认为这是不可能的

我的情况是,我有一个在很多很多数据库上运行的视图。在其中的一半,我需要一个WHERE子句。在另一半中,我不需要WHERE子句。保留它并不有害,因为我不会得到坏数据,但它会大大降低查询速度,因为它必须在不必要时读取一个大表并对其进行排序

Status_Table
ID    Status
1     Active
2     Inactive
3     Unknown    --this row of data will not exist in some DBs

Item_table
Item_ID    Status    value1    value2
1001          3      .....     .....
1002          1      .....     .....
我想做的是这样的事情

-- big nasty ugly query with various CTEs, selects, and joins
CASE    WHEN (SELECT MAX(ID) FROM Status_table) = 3
        THEN WHERE Item_Table.Status != 3
        ELSE WHERE 1=1
END

最终,我可能可以通过使用动态SQL构造查询来实现这一点,但我希望有一个更优雅的解决方案

您试图构建一个条件WHERE子句,是吗?我认为这样的事情对于你想做的事情会非常有效:

WHERE (EXISTS (SELECT 1 FROM Status_table WHERE ID = 3) 
        AND Item_Table.Status != 3)
        OR
        NOT EXISTS (SELECT 1 FROM Status_table WHERE ID = 3) 

您正在尝试构建一个条件WHERE子句,是吗?我认为这样的事情对于你想做的事情会非常有效:

WHERE (EXISTS (SELECT 1 FROM Status_table WHERE ID = 3) 
        AND Item_Table.Status != 3)
        OR
        NOT EXISTS (SELECT 1 FROM Status_table WHERE ID = 3) 
MS SQL Server 2014架构设置:

问题1:

MS SQL Server 2014架构设置:

问题1:


如果它的性能在您开始使用DECLARE和SET之后。 它只需要执行一次

DECLARE @UnkownExists AS INT
    SET @UnkownExists = (select count(*) from Status_table where ID = 3)

-- big nasty ugly query with various CTEs, selects, and joins
  WHERE (@UnkownExists=1 AND Item_Table.Status != 3) OR @NoUnknown=0 

如果它的性能在您开始使用DECLARE和SET之后。 它只需要执行一次

DECLARE @UnkownExists AS INT
    SET @UnkownExists = (select count(*) from Status_table where ID = 3)

-- big nasty ugly query with various CTEs, selects, and joins
  WHERE (@UnkownExists=1 AND Item_Table.Status != 3) OR @NoUnknown=0 
您可以尝试以下方法:

CASE WHEN (SELECT MAX(ID) FROM Status_table) = 3 
    THEN 3 
    ELSE (SELECT MAX(ID)+1 FROM Status_table) --Invalid value that will not exist
END <> Item_Table.Status
您可以尝试以下方法:

CASE WHEN (SELECT MAX(ID) FROM Status_table) = 3 
    THEN 3 
    ELSE (SELECT MAX(ID)+1 FROM Status_table) --Invalid value that will not exist
END <> Item_Table.Status

你的陈述毫无意义。当MAXID=3时,要设置哪个值?然后写下相同的表达式,但使用!=3和设置valueCASE是一个用于返回标量值的表达式。其中是用于筛选select语句结果的子句。简单地说,你想做的事情不能像你想做的那样去做。动态sql是必需的,但您不能在视图中这样做。也许您需要重新评估此处发生的情况。您是否试图将maxID从Status_表中排除,或者该值在Item_表中已经存在。如果是这样的话,只需根据您的Item_表值在普通WHERE中过滤即可。您也可以使用ROW_NUMBER窗口函数来获取MAXID。是的,@plaidDK,我理解这种语法没有意义。我想要的是一个条件WHERE子句。我希望在某些情况下,而不是在其他情况下,基于另一个表中的最大值,使用where子句。是的,我想避免使用动态SQL,因为这是一个视图,而将其移动到存储过程会在我的环境中带来一些其他问题。请左键连接到ID上的另一个表,然后在ORDER BY ID DESC上使用ROW_NUMBER,然后过滤掉该子查询的第一行,即rn1。您的case语句没有意义。当MAXID=3时,要设置哪个值?然后写下相同的表达式,但使用!=3和设置valueCASE是一个用于返回标量值的表达式。其中是用于筛选select语句结果的子句。简单地说,你想做的事情不能像你想做的那样去做。动态sql是必需的,但您不能在视图中这样做。也许您需要重新评估此处发生的情况。您是否试图将maxID从Status_表中排除,或者该值在Item_表中已经存在。如果是这样的话,只需根据您的Item_表值在普通WHERE中过滤即可。您也可以使用ROW_NUMBER窗口函数来获取MAXID。是的,@plaidDK,我理解这种语法没有意义。我想要的是一个条件WHERE子句。我希望在某些情况下,而不是在其他情况下,基于另一个表中的最大值,使用where子句。是的,我想避免使用动态SQL,因为这是一个视图,而将其移动到存储过程会在我的环境中带来一些其他问题。左键连接到ID上的另一个表,然后使用按ID描述排序的行数,然后过滤掉该子查询的第一行,即rn1。就是这样!我知道必须有一个合乎逻辑的方法来处理这个问题,但我只是在迷雾中迷失了方向。如果第一个EXISTS子句失败,查询优化器应该退出表扫描或索引扫描。就是这样!我知道必须有一个合乎逻辑的方法来处理这个问题,但我只是在迷雾中迷失了方向。如果第一个EXISTS子句失败,查询优化器应该退出表扫描或索引扫描。