Sql server 如何在sqlserver中检查CASE语句的THEN子句的条件

Sql server 如何在sqlserver中检查CASE语句的THEN子句的条件,sql-server,Sql Server,我有一个要求,比如需要检查CASE语句的THEN子句中的条件。请查看下面的示例 SELECT * FROM SampleTable t WHERE CASE WHEN (t.producttypeid = 1) THEN (CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.cre

我有一个要求,比如需要检查
CASE
语句的THEN子句中的条件。请查看下面的示例

SELECT *
FROM SampleTable t
WHERE 
    CASE
    WHEN (t.producttypeid = 1)
        THEN (CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME)) 
    WHEN (t.producttypeid IN (2, 3))
        THEN (CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME))
    END
对上述查询的解释:在上述查询的where子句中,我使用case语句检查producttypeid,并根据producttypeid的值检查releasedate和createddate的日期

但上述查询将给出以下语法错误:

*“>”附近的语法不正确

“')附近的语法不正确*

通过使用两个select语句和带有union的独立where子句,我完成了上述任务。请在下面查询

SELECT *
FROM SampleTable t
WHERE CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME)) 
UNION
SELECT *
FROM SampleTable t
WHERE CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME))
因此,日期检查应该在基于案例陈述的THEN子句中进行

但我想通过单选择查询来完成上述任务。请在这方面帮助我


提前感谢。

您可以通过一些布尔代数来实现这一点。试试这个:

SELECT * FROM SampleTable t WHERE t.producttypeid IN (1, 2, 3) AND ((
    t.producttypeid = 1 AND (
        CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME)
    )
) OR (
    t.producttypeid IN (2, 3) AND (
        CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME)
    )
))

你可以通过一些布尔代数来实现这一点。试试这个:

SELECT * FROM SampleTable t WHERE t.producttypeid IN (1, 2, 3) AND ((
    t.producttypeid = 1 AND (
        CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME)
    )
) OR (
    t.producttypeid IN (2, 3) AND (
        CAST(CONVERT(NVARCHAR(30), CAST(t.createddate AS DATETIME), 111) AS DATETIME) >= CAST(CONVERT(NVARCHAR(30), CAST(t.releasedate AS DATETIME), 111) AS DATETIME)
    )
))

您使用什么数据类型来存储
releasedate
createddate
?我有点被双重转换搞糊涂了,首先是日期,然后是字符串。我使用的是DateTime数据类型。仅检查日期比较需要双重转换。我不考虑时间,明白了!您可以这样简化:
。。。CAST(DateTimeField\u 1作为日期)=CAST(DateTimeField\u 2作为日期).
。应该更容易阅读,打字更快。如果@ FAFL帮助你,请考虑。这会奖励贡献者并帮助其他人找到一个可行的解决方案。你说得对,但我使用的是sqlserver ce。不支持CE日期函数。Vijay-我不知道。谢谢。您使用什么数据类型来存储
releasedate
createddate
?我有点被双重转换搞糊涂了,首先是日期,然后是字符串。我使用的是DateTime数据类型。仅检查日期比较需要双重转换。我不考虑时间,明白了!您可以这样简化:
。。。CAST(DateTimeField\u 1作为日期)=CAST(DateTimeField\u 2作为日期).
。应该更容易阅读,打字更快。如果@ FAFL帮助你,请考虑。这会奖励贡献者并帮助其他人找到一个可行的解决方案。你说得对,但我使用的是sqlserver ce。不支持CE日期函数。Vijay-我不知道。谢谢,这很好。但是我也必须检查producttypeid条件,就像首先我必须在(1,2,3)中检查t.producttypeid,然后我必须检查这些日期条件。因为有5种类型的产品ID,但是我只需要考虑1,2和3。OK,我在开始时添加了一个额外的检查。但它应该产生同样的结果,这很好。但是我也必须检查producttypeid条件,就像首先我必须在(1,2,3)中检查t.producttypeid,然后我必须检查这些日期条件。因为有5种类型的产品ID,但是我只需要考虑1,2和3。OK,我在开始时添加了一个额外的检查。但它应该产生同样的结果。