簡體   English   中英

從數組中刪除一個非唯一值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM