sql - 使用 Postgres 中的 Overlay 函数在不同位置更新同一列的多个值

标签 sql string postgresql sql-update overlay

test中有两列,如下所示。我想使用 Overlay 函数将消息中的第二个位置更新为“K”,将第四个位置更新为“N”,其中 id = 1。我可以按照下面的查询更新第二个位置,但无法找到第四个位置的解决方案。

您能给我一些指导吗?谢谢。

测试

    id | message
    ------------
    1  | ABCD
    2  | PQRS

我写了下面的查询:

update test
set message = overlay(message placing 'K' from 2 for 1)
where id = 1

我从 Postgres String Functions and Operators 得到了引用

最佳答案

如果你想用overlay()来做到这一点,你需要调用它两次:

overlay(overlay('ABCD' placing 'K' from 2 for 1) placing 'N' from 4 for 1)

您还可以使用substring():

substring(message, 1, 1) || 'K' || substr(message, 3, 1) || 'N' 

或者,如果消息可以包含超过4个字符:

substring(message, 1, 1) || 'K' || substr(message, 3, 1) || 'N' || substr(message, 5)

最后:一个更简洁的选项(尽管可能效率较低)使用正则表达式:

regexp_replace(message, '^(.)(?:.)(.)(?:.)', '\1K\2N')

关于sql - 使用 Postgres 中的 Overlay 函数在不同位置更新同一列的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64158667/

相关文章:

mysql - 如何使用 `SHOW COLUMNS` 作为有效数据源

c# - 使用 C# 解析 HTML 以获取内容

c - 我需要用 C 语言编写一个程序,它接受命令行输入,将其放入字符串数组中,然后反向打印该数组/打印

postgresql - 如何在 PostgreSQL 中对表的每一行应用一个过程(不是触发器)

php - 我可以从 postgres 触发器执行 cURL 调用吗

postgresql - SymmetricDS pk 替代方案

sql - 带有两个函数语句的 PostgreSQL 触发器

c++ - 排序a、b、c是否等价于排序c;对 b 进行排序;排序一个?

mysql - SQL 按日期排序,但需要最大值和最小值随时间发生。我需要 minTime minValue maxTime maxValue 按日期

c++ - 使用 C++ (Zune/ZDK) 在 WinCE 上构建 LPCWSTR