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