如何在SQL中用CASE语句或更优方式标记指定日期范围的行?
SQL日期范围标记:CASE语句实现与替代方案
一、修正后的CASE语句实现
你原SQL存在语法问题:日期值未加引号会被数据库解析为除法运算(比如01/07/2022会被计算成小数),必须用单引号包裹日期,且建议用YYYY-MM-DD格式避免格式歧义。正确写法如下:
SELECT CASE WHEN a.date BETWEEN '2022-07-01' AND '2022-07-19' THEN 1 ELSE 0 END AS Flag FROM dataset a
二、无需CASE语句的替代方案
不同SQL方言有更简洁的实现方式,核心是利用布尔表达式直接转换为数值:
1. MySQL/MariaDB
MySQL会自动将布尔值(TRUE/FALSE)转为1/0,直接用条件表达式即可:
SELECT (a.date BETWEEN '2022-07-01' AND '2022-07-19') AS Flag FROM dataset a
2. PostgreSQL
需显式将布尔值转为整数:
-- 写法1 SELECT CAST(a.date BETWEEN '2022-07-01' AND '2022-07-19' AS INT) AS Flag FROM dataset a -- 写法2(更简洁) SELECT (a.date BETWEEN '2022-07-01' AND '2022-07-19')::INT AS Flag FROM dataset a
3. SQL Server
可使用IIF函数替代,或显式转换布尔值:
-- 方法1:IIF函数 SELECT IIF(a.date BETWEEN '2022-07-01' AND '2022-07-19', 1, 0) AS Flag FROM dataset a -- 方法2:转换布尔值 SELECT CONVERT(INT, a.date BETWEEN '2022-07-01' AND '2022-07-19') AS Flag FROM dataset a
附表示例
| ID | DATE |
|---|---|
| 1 | 01/07/2022 |
| 2 | 08/07/2022 |
| 3 | 01/08/2022 |
| 4 | 05/08/2022 |
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

