sql中的 if 条件语句的用法

正文

IF 表达式

IF( a, b, c)

a的值为 TRUE,则返回值为 b
a的值为FALSE,则返回值为 c

如下:

SELECT IF(TRUE,1,2);
-> 1
 
SELECT IF(FALSE,1,2);
-> 2
 
SELECT IF(STRCMP("123","234"),"不相等","相等");
-> 不相等

举个例子:
查找出年龄大于18的学生,如果是男生的话,就要标注为栋梁,否则是未成年

select *,if(sex='man','栋梁','未成年') as student_ can_be from  class_1  where age>18

IFNULL 表达式

IFNULL( a, b)

判断第一个参数a是否为NULL

如果a不为空,直接返回a

如果a为空,返回第二个参数 b

SELECT IFNULL(NULL,"11");
-> 11
 
SELECT IFNULL("00","11");
-> 00

NULLIF 表达式

NULLIF(a,b):如果两个参数相等则返回NULL,否则返回第一个参数的值a

mysql> select nullif(1,1),nullif(123,234);
+-------------+-----------------+
| nullif(1,1) | nullif(123,234) |
+-------------+-----------------+
|        NULL |             123 |
+-------------+-----------------+

在SQL语句中实现“if-then-else”逻辑计算功能

1)simple case的语法结构:

CASE  value
 
    WHEN  [compare_value] THEN  result
 
    [WHEN [compare_value] THEN  result ...] 
 
    [ELSE  result]  END

语义:

将case后面的值value分别和每个when子句后面的值compare_value进行相等比较

1,如果一旦和某个when子句后面的值相等则返回相应的then子句后面的值result;

2,如果和所有when子句后面的值都不相等,则返回else子句后面的值;

3,如果没有else部分则返回null。

注意:

①value可以是字面量、表达式或者列名

②CASE表达式的数据类型取决于跟在then或else后面的表达式的类型

类型必须相同(可尝试做隐式类型转换),否则出错

mysql> select userid,case salary                                             
    -> when 1000 then 'low'
    -> when 2000 then 'med'
    -> when 3000 then 'high'
    -> else '无效值' end salary_grade
    -> from salary_tab;
+--------+--------------+
| userid | salary_grade |
+--------+--------------+
|      1 | low          |
|      2 | med          |
|      3 | high         |
|      4 | 无效值        |
|      5 | low          |
+--------+--------------+

2)searched case的语法结构:

CASE
 
    WHEN [condition] THEN result
 
    [WHEN [condition] THEN result ...]
 
    [ELSE result]  END


语义:

1,如果某个when子句后面的条件conditiontrue,则返回相应的when子句后面的值result

2,如果所有的when子句后面的条件condition都不为true,则返回else子句后面的值;

3,如果没有else部分则返回null

mysql> select userid,case
    -> when salary<=1000 then 'low'
    -> when salary=2000 then 'med'
    -> when salary>=3000 then 'high'
    -> else '无效值' end salary_grade
    -> from salary_tab;
+--------+--------------+
| userid | salary_grade |
+--------+--------------+
|      1 | low          |
|      2 | med          |
|      3 | high         |
|      4 | 无效值        |
|      5 | low          |
+--------+--------------+

最后:祝大家开开心心每一天

<think>好的,用户想了解如何在SQL中使用IF条件语句。首先,我需要回忆SQL中常见的条件语句函数。记得在MySQL里有IF函数,语法是IF(condition, value_if_true, value_if_false)。比如用户提供的例子,SELECT IF(TRUE,1,2)返回1,这应该没错。然后还有NULLIF函数,当两个参数相等时返回NULL,否则返回第一个参数,比如NULLIF(1,1)返回NULL,而NULLIF(123,234)返回123,这部分需要确认是否正确。 接着,用户可能还会用到CASE语句,这在标准SQL中更通用。比如CASE WHEN condition THEN result1 ELSE result2 END,可以处理多个条件。例如按分数分类,这样的例子比较直观,用户容易理解。 另外,Hive SQL中的IF用法MySQL类似,但可能有一些扩展。例如用户提到的例子,用IF来统计购买次数分层,这里可能需要结合聚合函数,比如COUNT和GROUP BY。要注意说明Hive中的IF是否与其他SQL方言有差异。 用户提供的引用资料提到,在Hive中可以用IF转换和归类数据,比如根据购买次数分组。这可能需要结合CASE语句或嵌套IF函数。需要确保给出的示例准确,并且语法正确。 还要注意不同数据库系统的差异,比如MySQLSQL Server、PostgreSQL和Hive在IF函数上的支持情况。例如,SQL Server可能更依赖CASE语句,而MySQL和Hive支持IF函数。需要指出这一点,避免用户在不同环境中混淆。 可能用户的实际需求是根据条件进行数据筛选或转换,比如计算字段、处理NULL值,或者分类统计。因此,示例应覆盖这些常见场景,如处理NULL、分类、动态列生成等。 需要检查是否有遗漏的重要函数,比如COALESCE或DECODE,但根据问题,重点在IF条件语句,所以可能不需要深入其他函数。但可以简要提及,供用户扩展了解。 最后,确保回答结构清晰,分点列出不同方法,并给出示例代码,用正确的LaTeX格式标注行内公式,如函数名用$IF()$。同时,相关问题要覆盖性能、优化、应用场景等,帮助用户深入学习。</think>### SQLIF 条件语句用法详解 在 SQL 中,`IF` 条件语句主要通过以下方式实现: --- #### 1. **IF 函数(MySQL/Hive 支持)** 语法: $$IF(condition, \ value\_if\_true, \ value\_if\_false)$$ **示例**: ```sql -- 基本用法 SELECT IF(TRUE, 1, 2); --> 输出 1 SELECT IF(FALSE, 1, 2); --> 输出 2 -- 结合字符串比较函数 SELECT IF(STRCMP("123", "234"), "不相等", "相等"); --> 输出 "不相等" [^1] -- 嵌套其他函数 SELECT IF(LENGTH(username) > 5, "长用户名", "短用户名") FROM users; ``` --- #### 2. **NULLIF 函数(通用 SQL 函数)** 语法: $$NULLIF(a, b)$$ 若 $a = b$,返回 `NULL`;否则返回 $a$。 **示例**: ```sql SELECT NULLIF(1, 1); --> 输出 NULL SELECT NULLIF(123, 234); --> 输出 123 [^2] ``` --- #### 3. **CASE 语句(标准 SQL 语法,跨数据库通用)** 语法: ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default_result END ``` **示例**: ```sql -- 根据分数分类 SELECT student_id, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END AS grade FROM exams; -- 处理 NULL 值 SELECT product_name, CASE WHEN stock IS NULL THEN 0 ELSE stock END AS valid_stock FROM products; ``` --- #### 4. **Hive SQL 中的扩展用法** 在 Hive 中,`IF` 常用于数据分层和聚合逻辑: ```sql -- 统计用户购买次数的分层 SELECT sku_id, COUNT(IF(purchase_count > 0, user_id, NULL)) AS single_buyers, COUNT(IF(purchase_count >= 2, user_id, NULL)) AS repeat_buyers FROM user_purchases GROUP BY sku_id; [^3] ``` --- ### 关键差异与适用场景 | 方法 | 适用场景 | 数据库支持 | |---------------|----------------------------------|--------------------------| | `IF()` | 简单二元条件 | MySQL, Hive | | `NULLIF()` | 处理重复值返回 NULL | 标准 SQL(多数数据库支持)| | `CASE` | 多条件分支或复杂逻辑 | 所有 SQL 数据库 | --- §§ 1. 如何在 SQL Server 中实现类似 `IF` 的条件判断? 2. `CASE` 语句与 `IF` 函数在性能上有何差异? 3. 如何处理嵌套 `IF` 导致的代码可读性问题? 4. 在 Hive SQL 中,如何用 `IF` 优化大数据量查询? [^1]: SQL 中 `IF` 函数支持嵌套其他函数进行复杂判断。 : `NULLIF` 常用于避免重复值干扰计算逻辑。 [^3]: Hive 中 `IF` 常用于分组统计和条件聚合场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值