在 where 条件中添加 case 语句并在 then 子句中提供条件语句
Adding case statement inside where condition and provide conditional statements inside then clause
我有一个 where
子句,我需要在其中添加 case
语句,在 then
和 else
中我必须给出条件语句。
我的 where 条件是这样的
WHERE
CASE
WHEN
Substring(datename(dw,getdate()),1,3) = 'mon'
THEN convert(varchar,dt_start,103) = convert(varchar,dateadd(day,-3,getdate()),103)
AND convert(varchar,dt_start,103) <= convert(varchar,dateadd(day,-2,getdate()),103)
ELSE convert(varchar,dt_start,103) = convert(varchar,dateadd(day,-1,getdate()),103)
END
但是此查询在 then
内的 =
处显示语法错误。同样的逻辑在 PostgreSQL 中起作用,但是当我在 SQL 服务器中尝试时,它在 = 处出现语法错误。我该如何解决这个问题。请帮忙
这是对应的 PGSQL 查询。
WHERE
CASE
WHEN to_char(now(), 'dy'::text) = 'mon'::text THEN to_char(dt_start, 'yyyymmdd'::text) = to_char(now() - '3 days'::interval, 'yyyymmdd'::text) AND to_char(dt_start, 'yyyymmdd'::text) <= to_char(now() - '2 days'::interval, 'yyyymmdd'::text)
ELSE to_char(dt_start, 'yyyymmdd'::text) = to_char(now() - '1 day'::interval, 'yyyymmdd'::text)
END
试试这个
WHERE
convert(varchar,dt_start,103)=
CASE
WHEN
Substring(datename(dw,getdate()),1,3) = 'mon'
THEN convert(varchar,dt_start,103) =
convert(varchar,dateadd(day,-3,getdate()),103)
ELSE convert(varchar,dt_start,103) =
convert(varchar,dateadd(day,-1,getdate()),103)
END
AND
convert(varchar,dt_start,103)<=
CASE
WHEN
Substring(datename(dw,getdate()),1,3) = 'mon'
then convert(varchar,dateadd(day,-2,getdate()),103)
else
--put a condition that does not filter any data (maybe)
convert(varchar,getdate(),103)
end
试试这个:你必须根据你的要求制定两个单独的条件并记住一件事,你只能开始 CASE
作为 WHERE a = CASE
而不是WHERE CASE ...THEN a = b+c ...
或者在这种情况下,我建议使用动态查询,这样可以很容易地根据不同条件操作查询[=14=]
WHERE convert(varchar,dt_start,103) =
CASE WHEN Substring(datename(dw,getdate()),1,3) = 'mon' THEN
convert(varchar,dateadd(day,-3,getdate()),103)
ELSE
convert(varchar,dateadd(day,-1,getdate()),103)
END
AND convert(varchar,dt_start,103) <=
CASE WHEN Substring(datename(dw,getdate()),1,3) = 'mon' THEN
convert(varchar,dateadd(day,-2,getdate()),103)
ELSE
convert(varchar,dt_start,103)
END
我有一个 where
子句,我需要在其中添加 case
语句,在 then
和 else
中我必须给出条件语句。
我的 where 条件是这样的
WHERE
CASE
WHEN
Substring(datename(dw,getdate()),1,3) = 'mon'
THEN convert(varchar,dt_start,103) = convert(varchar,dateadd(day,-3,getdate()),103)
AND convert(varchar,dt_start,103) <= convert(varchar,dateadd(day,-2,getdate()),103)
ELSE convert(varchar,dt_start,103) = convert(varchar,dateadd(day,-1,getdate()),103)
END
但是此查询在 then
内的 =
处显示语法错误。同样的逻辑在 PostgreSQL 中起作用,但是当我在 SQL 服务器中尝试时,它在 = 处出现语法错误。我该如何解决这个问题。请帮忙
这是对应的 PGSQL 查询。
WHERE
CASE
WHEN to_char(now(), 'dy'::text) = 'mon'::text THEN to_char(dt_start, 'yyyymmdd'::text) = to_char(now() - '3 days'::interval, 'yyyymmdd'::text) AND to_char(dt_start, 'yyyymmdd'::text) <= to_char(now() - '2 days'::interval, 'yyyymmdd'::text)
ELSE to_char(dt_start, 'yyyymmdd'::text) = to_char(now() - '1 day'::interval, 'yyyymmdd'::text)
END
试试这个
WHERE convert(varchar,dt_start,103)= CASE WHEN Substring(datename(dw,getdate()),1,3) = 'mon' THEN convert(varchar,dt_start,103) = convert(varchar,dateadd(day,-3,getdate()),103) ELSE convert(varchar,dt_start,103) = convert(varchar,dateadd(day,-1,getdate()),103) END AND convert(varchar,dt_start,103)<= CASE WHEN Substring(datename(dw,getdate()),1,3) = 'mon' then convert(varchar,dateadd(day,-2,getdate()),103) else --put a condition that does not filter any data (maybe) convert(varchar,getdate(),103) end
试试这个:你必须根据你的要求制定两个单独的条件并记住一件事,你只能开始 CASE
作为 WHERE a = CASE
而不是WHERE CASE ...THEN a = b+c ...
或者在这种情况下,我建议使用动态查询,这样可以很容易地根据不同条件操作查询[=14=]
WHERE convert(varchar,dt_start,103) =
CASE WHEN Substring(datename(dw,getdate()),1,3) = 'mon' THEN
convert(varchar,dateadd(day,-3,getdate()),103)
ELSE
convert(varchar,dateadd(day,-1,getdate()),103)
END
AND convert(varchar,dt_start,103) <=
CASE WHEN Substring(datename(dw,getdate()),1,3) = 'mon' THEN
convert(varchar,dateadd(day,-2,getdate()),103)
ELSE
convert(varchar,dt_start,103)
END