pgsql中set里面用case
时间: 2024-04-27 11:21:53 浏览: 107
在 PostgreSQL 中,可以在 SET 子句中使用 CASE 表达式来根据条件设置列的值。
例如,假设我们有一个名为 users 的表,其中包含 id、name 和 age 列。我们想要根据年龄设置每个用户的状态,如果年龄小于 18 岁,则状态为 "未成年",否则状态为 "成年"。可以使用以下语句:
```
UPDATE users
SET status = CASE
WHEN age < 18 THEN '未成年'
ELSE '成年'
END;
```
这个语句中,我们使用 CASE 表达式根据 age 列的值设置 status 列的值。如果 age 小于 18,则设置为 "未成年",否则设置为 "成年"。注意,CASE 表达式需要以 END 结尾。
如果我们想要根据其他列的值设置 status 列的值,可以在 WHEN 子句中添加其他条件,并在 ELSE 子句中指定默认值。例如,如果我们想要根据 name 列的值设置 status 列的值,可以使用以下语句:
```
UPDATE users
SET status = CASE
WHEN name LIKE '张%' THEN '张家人'
WHEN name LIKE '李%' THEN '李家人'
ELSE '其他'
END;
```
这个语句中,我们使用 CASE 表达式根据 name 列的值设置 status 列的值。如果 name 以 "张" 开头,则设置为 "张家人",如果 name 以 "李" 开头,则设置为 "李家人",否则设置为 "其他"。
相关问题
pgsql ON CONFLICT
### PostgreSQL ON CONFLICT UPSERT 示例
当处理可能存在的重复键冲突时,`ON CONFLICT`子句提供了一种优雅的方式来实现UPSERT(即插入或更新)。此功能自PostgreSQL 9.5版本引入[^2]。
对于一个简单的例子,假设有一个名为 `employees` 的表,其中包含字段 `employee_id`, `name`, 和 `salary`。为了防止因尝试插入具有相同 `employee_id` 的新记录而引发错误,可以使用如下SQL语句:
```sql
INSERT INTO employees (employee_id, name, salary)
VALUES (1, 'Alice', 70000)
ON CONFLICT (employee_id) DO UPDATE SET
name = EXCLUDED.name,
salary = EXCLUDED.salary;
```
上述命令会试图向 `employees` 表中添加一条新的员工记录。如果发现 `employee_id` 已经存在,则不会抛出异常而是执行指定的UPDATE动作,这里是指定将要被插入的新值覆盖现有行对应的列值。
另外,在更复杂的场景下,比如仅当某些条件满足时才允许更新特定列的情况下,可以在 `DO UPDATE` 部分加入额外逻辑来控制行为:
```sql
INSERT INTO employees (employee_id, name, salary)
VALUES (1, 'Bob', 80000)
ON CONFLICT (employee_id) DO UPDATE SET
salary = CASE WHEN excluded.salary > employees.salary THEN excluded.salary ELSE employees.salary END;
```
这段代码表示只有当待插入的数据中的薪水高于当前数据库中存在的对应员工的薪水时才会更新该员工的信息。
PGSQL 清空数组
### 如何在PostgreSQL中清空数组
在PostgreSQL中,可以通过多种方式来清空或重置数组。以下是几种常见方法:
#### 方法一:使用 `ARRAY[]` 构造函数
最简单的方式是将数组设置为空数组。
```sql
UPDATE table_name SET column_array = ARRAY[]::integer[];
```
这条语句会把指定列中的数组更新为空数组,并指定了数据类型的整数数组[^1]。
#### 方法二:通过SQL表达式操作
如果希望基于某些条件动态地清除数组内容,则可以利用CASE WHEN结构来进行判断处理。
```sql
UPDATE table_name
SET column_array = CASE
WHEN some_condition THEN '{}'::text[]
ELSE column_array
END;
```
这里展示了当满足特定条件时才执行清空动作的情况。
#### 方法三:删除并重新初始化
对于存储复杂类型(如记录型)的数组来说,可能需要先将其设为NULL再赋予新值。
```sql
UPDATE table_name
SET column_array = NULL,
column_array = '{}';
```
这种方式适用于那些不允许直接赋给空数组的情形下作为替代方案。
需要注意的是,在实际应用过程中应当考虑业务逻辑需求以及性能影响等因素选择合适的方法。
阅读全文
相关推荐















