sql 能加几个case
时间: 2023-05-24 08:04:28 浏览: 71
在SQL中可以加多个CASE语句,但是一般没有必要在一个SELECT语句中使用太多的CASE语句,因为这会导致查询变得复杂和难以理解。通常情况下,两到三个CASE语句足以满足大多数查询的需求。如果需要使用更多的CASE语句,建议将查询拆分成多个步骤或使用视图来简化查询。
相关问题
分成几个sql来更新
将更新子节点到其他父节点的 SQL 查询分成多个查询可以使操作更加安全和可控。以下是一种分成多个 SQL 查询的方法:
1. 查询要移动的子节点及其所有后代节点的左右值。
2. 计算要更新的节点及其后代节点的左右值的偏移量。
3. 开启事务。
4. 更新所有左值大于当前节点的左值且右值小于当前节点的右值的节点的左值和右值。
5. 更新所有左值大于当前节点的右值的节点的左值和右值。
6. 更新当前节点及其所有后代节点的左值和右值。
7. 更新所有左值大于或等于目标父节点的左值的节点的左值和右值。
8. 更新所有左值大于目标父节点的右值的节点的左值和右值。
9. 提交事务。
以下是一个分成多个 SQL 查询的示例:
```
SET @myLeft := 0, @myRight := 0, @offset := :offset;
SELECT lft, rgt, rgt - lft + 1 INTO @myLeft, @myRight, @size
FROM categories
WHERE id = :categoryId;
START TRANSACTION;
UPDATE categories
SET lft = lft + @offset
WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE categories
SET rgt = rgt + @offset
WHERE rgt BETWEEN @myLeft AND @myRight;
UPDATE categories
SET lft = CASE
WHEN lft BETWEEN @myLeft AND @myRight THEN lft + @offset
ELSE lft
END,
rgt = CASE
WHEN rgt BETWEEN @myLeft AND @myRight THEN rgt + @offset
ELSE rgt
END
WHERE rgt > @myRight;
UPDATE categories
SET lft = CASE
WHEN lft > @parentRight THEN lft + @size
ELSE lft
END,
rgt = CASE
WHEN rgt > @parentRight THEN rgt + @size
ELSE rgt
END
WHERE lft >= @parentLeft;
UPDATE categories
SET lft = CASE
WHEN lft > @parentRight THEN lft + @size
ELSE lft
END,
rgt = CASE
WHEN rgt > @parentRight THEN rgt + @size
ELSE rgt
END
WHERE rgt > @parentRight;
COMMIT;
```
在这个示例中,第 4~6 个 SQL 查询更新了要移动的子节点及其所有后代节点的左右值,第 7~8 个 SQL 查询更新了和目标父节点相关的节点的左右值。这些 SQL 查询都在一个事务中执行,以确保操作的原子性和一致性。
sql的case when
case when是SQL中的一种条件表达式,它可以在查询语句中根据不同的条件返回不同的结果。通常用于在查询结果中进行条件判断和数据转换。case when语句的一般语法如下:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE result
END
其中,condition1、condition2等是待判断的条件,result1、result2等是对应条件的结果。如果所有条件都不满足,将返回ELSE后指定的结果。case when语句可以嵌套使用,提供多层条件判断和结果返回。
下面是几个使用case when的示例:
- 示例1:根据学生选课情况判断是否为主修课程
SELECT std_id,
CASE WHEN COUNT(*) = 1 THEN MAX(class_id)
ELSE MAX(CASE WHEN main_class_flg = 'Y' THEN class_id ELSE NULL END )
END AS main_class
FROM Studentclass
GROUP BY std_id;
这个示例中,当一个学生只选择了一门课程时,返回该门课程的class_id;当一个学生选择了多门课程时,返回该学生的主修课程的class_id。
- 示例2:交换表中的主键a和b的值
UPDATE SomeTable
SET p_key = CASE WHEN p_key = 'a' THEN 'b'
WHEN p_key = 'b' THEN 'a'
ELSE p_key
END
WHERE p_key IN ('a', 'b');
在这个示例中,将表中主键为'a'的值替换为'b',主键为'b'的值替换为'a',其他值保持不变。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)