关键字:
truncate, case, return query、人大金仓、KingbaseES
truncate
TRUNCATE是一种用于快速删除表中所有数据的操作。它类似于DELETE语句,但具有以下区别和特点:
1. 速度:TRUNCATE操作通常比使用DELETE语句删除所有行更快。这是因为TRUNCATE操作直接删除整个表的内容,而不需要逐行执行删除操作。
2. 事务:TRUNCATE操作是一个事务操作,这意味着在执行TRUNCATE时会启动一个事务,并且该操作是不可逆的。如果TRUNCATE语句执行成功,则表中的所有数据将被永久删除,无法回滚。
3. 触发器和日志:TRUNCATE操作不会触发表上的触发器,也不会记录删除操作的日志。这意味着在执行TRUNCATE时,不会执行与触发器关联的任何操作,并且不会在日志中记录每个行的删除信息。
要使用TRUNCATE语句删除表中的所有数据,可以使用以下语法:
TRUNCATE TABLE table_name;
其中,table_name是要删除数据的表的名称。
请注意,TRUNCATE操作会删除表中的所有数据,但不会删除表本身。如果要删除整个表(包括结构和数据),可以使用DROP TABLE语句。
重要提示:在执行TRUNCATE操作之前,请务必备份表中的数据,以防意外发生。
case
在SQL中,CASE表达式用于在查询中进行条件判断和返回不同的结果。它有两种形式:简单形式和搜索形式。
1. 简单形式:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE result
END
在简单形式中,每个WHEN子句都有一个条件和一个结果。条件满足时,返回对应的结果。如果没有任何条件满足,则返回ELSE子句中的结果。
示例:
SELECT
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE 'D'
END AS grade
FROM students;
上述示例根据学生的分数将其等级分为A、B、C或D。
2. 搜索形式:
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE result
END
在搜索形式中,CASE后面的表达式的值与WHEN子句中的值进行比较。如果匹配,则返回对应的结果。如果没有匹配的值,则返回ELSE子句中的结果。
示例:
SELECT
CASE gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
ELSE 'Unknown'
END AS gender_category
FROM employees;
上述示例将员工的性别转换为对应的类别,如'M'转换为'Male','F'转换为'Female',其他值转换为'Unknown'。
这是CASE表达式的基本用法。它还可以与其他查询语句和函数一起使用,以实现更复杂的逻辑和计算。
return query
在SQL中,RETURN QUERY用于在函数中返回一个查询的结果集。它可以将一个 SELECT查询的结果集作为函数的返回值。
以下是一个示例:
CREATE OR REPLACE FUNCTION get_employee_names()
RETURNS TABLE (employee_name TEXT)
AS $$
BEGIN
RETURN QUERY SELECT name FROM employees;
END;
$$ LANGUAGE plpgsql;
在上述示例中,get_employee_names函数返回一个结果集,其中包含employees表中所有员工的姓名。函数的返回类型是一个表,它有一个名为employee_name的列,其数据类型为TEXT。可以在调用函数时将其作为一个查询来使用:
SELECT * FROM get_employee_names();
这将返回一个包含所有员工姓名的结果集。
以下是另一个示例:
CREATE TABLE t1(id int);
INSERT INTO t1 SELECT generate_series(1,10);
CREATE or replace function test_returnquery()
returns TABLE(id int)
as $$
DECLARE
BEGIN
return query select * from t1 where t1.id < 3;
raise info 'not return after return query';
END;
$$ language plpgsql;
测试该函数执行结果如下:
kingbase=# select test_returnquery();
INFO: not return after return query
test_returnquery
------------------
1
2
(2 rows)
可知return query不会立即退出当前函数。




