如何从PostgreSQL字符串列中删除多个字符串

oknrviil  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(334)

在我的PSQL数据库中,我有以下表结构,我想了解如何从currentIdstotalIds中删除多个字符串

CREATE TABLE "public"."candidates" (
    "day" timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "study_id" varchar(6) NOT NULL,
    "site_id" varchar(32),
    "status" varchar(32) NOT NULL,
    "total" int4 NOT NULL,
    "current" int4 NOT NULL,
    "referrer_token" varchar(255) NOT NULL DEFAULT 'NO_REFERRER_TOKEN'::character varying,
    "total_ids" text NOT NULL DEFAULT '|'::text,
    "current_ids" text NOT NULL DEFAULT '|'::text
);

我想实现的是下面的例子。
例如:

current_ids: '|ABX1-001|ABX1-002|ABX1-003|ABX1-004|ABX1-005|ABX1-006|'
total_ids: '|ABX1-001|ABX1-002|ABX1-003|ABX1-004|ABX1-004|ABX1-006|ABX1-007|'

从这两列中,我想删除ID:'ABX1- 003'、'ABX1- 006'、'ABX1-007'
所以最终的结果是:

current_ids: '|ABX1-001|ABX1-002|ABX1-004|ABX1-005|'
total_ids: '|ABX1-001|ABX1-002|ABX1-004|ABX1-004|'

我试过这样的方法,但没有成功

UPDATE
    candidates
SET
    "current_ids" = regexp_replace("current_ids", 'ABX1-003|ABX1-006|ABX1-007', '', 'g')
WHERE
    "current_ids" in('ABX1-003', 'ABX1-006', 'ABX1-007')
rn0zuynd

rn0zuynd1#

以下查询将仅更新包含要更改的字符串的行:

WITH patterns(pattern) AS (
  VALUES ('(?<=\|)(ABX1-003|ABX1-006|ABX1-007)\|'))
UPDATE candidates
  SET current_ids = regexp_replace(current_ids, patterns.pattern, '', 'g'),
      total_ids = regexp_replace(current_ids, patterns.pattern, '', 'g')
  FROM patterns
  WHERE candidates.current_ids ~ patterns.pattern
     OR candidates.total_ids ~ patterns.pattern;

使用单个模式来选择将受影响的行并驱动正则表达式替换。后看(?<=\|)确保每个替换匹配之前都有一个|分隔符,而不会被匹配消耗掉|;因此将只找到全字段匹配。

相关问题