我有看起來像這樣的資料庫
CREATE TABLE code (
id SERIAL,
name VARCHAR(255) NOT NULL
);
INSERT INTO code (name) VALUES ('random_value1_random');
INSERT INTO code (name) VALUES ('random_value123_random');
CREATE TABLE value (
id SERIAL,
name VARCHAR(255) NOT NULL
);
INSERT INTO value (name) VALUES ('value1');
INSERT INTO value (name) VALUES ('value123');
UPDATE code SET name = REPLACE(name, SELECT name from value , '');
我想更新我的表code以洗掉部分代碼,并且該代碼來自另一個表。我的目標是更新所有值code并洗掉與另一個值匹配的字串部分。我的最終目標是使code.name示例中的所有內容看起來像:random_random從value表中洗掉值。
當嘗試使用查詢替換時,出現錯誤:
[21000] 錯誤:用作運算式的子查詢回傳的行不止一行
有什么更清潔的更好的方法來做到這一點?
uj5u.com熱心網友回復:
您可以使用REGEXP_REPLACE替換字串中的多個子字串。您可以使用STRING_AGG從單個搜索值中獲取搜索模式。
UPDATE code SET name =
REGEXP_REPLACE( name,
(SELECT '(' || STRING_AGG(name, '|') || ')' from value),
''
);
這會給你留下'random___random',而不是'random_random'。如果您只想查找用下劃線字符分隔的子字串,請使用
UPDATE code SET name =
TRIM('_' FROM
REGEXP_REPLACE(name,
(SELECT '(' || STRING_AGG('_?' || name || '_?', '|') || ')' from value),
'_'
)
);
演示:https ://dbfiddle.uk/RrOel8Ns
uj5u.com熱心網友回復:
這個 T-SQL(我沒有 Postgres)并不優雅,但它可以作業..
;with l as (
-- Match the longest value first
select c.id c_id, v.id v_id, ROW_NUMBER () over (partition by c.id order by len(v.name) desc) r
from code c
join value v on charindex (v.name, c.name) > 0)
, l1 as (
-- Select the longest value first
select c_id, v_id from l where r = 1
)
update c set name = REPLACE(c.name, v.name, '')
from l1
join code c on c.id = l1.c_id
join value v on v.id = l1.v_id
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/531030.html
上一篇:僅洗掉前導零而不是全零
