在将文本字符串从一个数据库迁移到另一个数据库时,我需要消除所有特殊字符,并在单词之间只保留一个空格.

不幸的是,下面的代码消除了单词之间的所有空格,这不是我想要的.

Here is the code I have. The "sig" field is wrong (it removes all spaces without leaving one space). Where did I go wrong?
TIA

WITH dbl_medications AS (
    SELECT * 
    FROM dblink('select medname, sig, form from medications')
    AS t1(medname text, sig text, form text)
    ORDER BY medname, form, sig
    )
INSERT INTO medications (medname, sig, form)    
    SELECT REGEXP_REPLACE(LOWER(REGEXP_REPLACE(medname,'[^a-zA-Z0-9 /-]','','g')), '^ +| +$| +(?= )', '', 'g'),
           REGEXP_REPLACE(LOWER(REGEXP_REPLACE(sig,'[^0-9a-zA-Z:/]',' ','g')), '^ +| +$| +(?= )', '', 'g'),
           LOWER(REGEXP_REPLACE(form,'[^a-zA-Z]','','g'))         
    FROM dbl_medications
    ORDER BY 1,3,2
ON CONFLICT (medname, sig, form) DO NOTHING;

推荐答案

您可以使用

REGEXP_REPLACE(LOWER(REGEXP_REPLACE(sig,'[^[:alnum:][:space:]:/]+',' ','g')), '^[[:space:]]+|[[:space:]]+$|[[:space:]]+(?=[[:space:]])', '', 'g')

[^[:alnum:][:space:]:/]+个正则表达式用于将字母数字、空格、:/字符以外的一个或多个字符的块替换为单个空格.

^[[:space:]]+|[[:space:]]+$|[[:space:]]+(?=[[:space:]])正则表达式用于删除前导(^[[:space:]]+)和尾随([[:space:]]+$)空格,并删除多余的空格([[:space:]]+(?=[[:space:]])).

Postgresql相关问答推荐

有没有方法可以设置postGER中非空列的默认值?

PostgreSQL\d命令:有办法只 Select 一列吗?

在Postgres游标中从一行变量中减go 另一行变量

JPA将没有时区的Postgres时间戳调整为服务器时区

EF Core和npgsql连接池已被耗尽

PG 16 的 AGE 安装抛出错误:无法创建 src/backend/parser/ag_scanner.c

连接到 PostgreSQL 时没有属性执行错误

如何将 NULL 值插入 UUID 而不是零

使用 Heroku CLI、Postgres 的 SQL 语法错误

如何更改几何列的 SRID?

如何从 WSL 连接到 windows postgres 数据库

SELECT INTO 具有多个归因

如何让 Rails 使用 SSL 连接到 PostgreSQL?

'active' 标志与否?

H2 postgresql mode模式似乎不起作用

PostgreSQL 权限解释

Postgres NOT IN (null) 没有结果

当成功有时会导致退出代码为 1 时,如何可靠地确定 pg_restore 是否成功?

使用 Homebrew 安装 icu4c 版本 63

Heroku 上的 Postgres 并将单个表转储到转储文件