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,我在开始时添加了一个额外的检查。但它应该产生同样的结果。