[英]Remove one, non-unique value from an array
鑒於PostgreSQL 9.6中的這個表:
CREATE TABLE test_table (
id int PRIMARY KEY
, test_array text[]
);
有一行像:
INSERT INTO test_table (id, test_array)
VALUES (1 , '{A,A,A,B,B,B}');
我如何刪除一個'B'值?
我不能用:
UPDATE test_table
SET test_array = array_remove(test_array, 'B')
WHERE id = 1;
因為它刪除了值'B'的所有元素。 我只想刪除一個元素(比如第一個元素)。
有任何想法嗎?
在擴展了本頁提供的信息后(Sharon Ben Asher建議),我找到了答案.https://dba.stackexchange.com/questions/94639/delete-array-element-by-index
創建那里提到的功能:
CREATE OR REPLACE FUNCTION f_array_remove_elem(anyarray, int)
RETURNS anyarray LANGUAGE sql IMMUTABLE AS
'SELECT $1[1:$2-1] || $1[$2+1:2147483647]';
並在此基礎上實現array_position,該示例的最終語句:
UPDATE test_table SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B')) WHERE id = 1;
根據我在dba.SE上的舊答案,您發現並充分利用:
您可以更進一步:
CREATE OR REPLACE FUNCTION f_array_remove_elem1(anyarray, anyelement)
RETURNS anyarray LANGUAGE sql IMMUTABLE AS
'SELECT $1[:idx-1] || $1[idx+1:] FROM array_position($1, $2) idx';
此函數將要刪除的元素的值作為第二個參數。 相應地使用多態偽類型anyelement
使這適用於任何數組類型。
那么UPDATE
就是:
UPDATE test_table
SET test_array = f_array_remove_elem1(test_array, 'B')
WHERE id = 1;
db <> 在這里小提琴
在使用我的原始函數f_array_remove_elem()
獲取索引位置而不是元素值時,您可以不使用子查詢:
UPDATE test_table
SET test_array = f_array_remove_elem(test_array, array_position(test_array, 'B'))
WHERE id = 1;
甚至可能比我的新功能快一點。
請注意,我的舊答案底部的更簡單的版本適用於Postgres 9.6。
你可以嘗試這個
select SUBSTRING ( '{A,A,A,B,B,B}',1,position('B' in '{A,A,A,B,B,B}') -1)||SUBSTRING ('{A,A,A,B,B,B}',position('B' in '{A,A,A,B,B,B}')+1)
首先在字符串中找到B的位置,然后在第一次出現B之前得到子字符串,即'{A,A,A,然后得到剩余字符串的子字符串,留下B即B,B}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.