PostgreSQL 12.0

https://www.postgresql.org/docs/current/ltree.html

Étant donné le tableau suivant :

Create Table IF NOT EXISTS Tree
(
    path          ltree PRIMARY KEY,
    amount BIGINT DEFAULT 0 NOT NULL,
    added_values double precision DEFAULT 0 NOT NULL
);

Avec les données suivantes :

path           | amount     | added_values
---------------+------------+-------------
Tree.Cash      | 20         | 2000 
Tree.Cash.Hans | 20         | 1200 
Tree.Cash.Peter| 10         | 1000 
Tree.Cash.Cash | 30         | 900  
Tree.Cash.asd  | 40         | 1600 

Je veux changer toutes les étiquettes qui sont égales à « Cash » avec la nouvelle valeur « Coin ».

Résultats désirés:

path           | amount     | added_values
---------------+------------+-------------
Tree.Coin      | 20         | 2000 
Tree.Coin.Hans | 20         | 1200 
Tree.Coin.Peter| 10         | 1000 
Tree.Coin.Coin | 30         | 900  
Tree.Coin.asd  | 40         | 1600 

Est-ce que quelqu'un peut m'aider?

Edit : 'Cash' pourrait apparaître sur une autre étiquette 'Tree.Cash.Cash' par exemple

-1
Ojav 6 févr. 2020 à 21:28

1 réponse

Meilleure réponse

Vous devriez pouvoir utiliser replace(). En supposant que cash n'apparaisse qu'une seule fois :

update t
    set path = replace(path, '.cash.', '.coin.')
    where path ~ '[.]cash[.]' and
          path not ~ '[.]cash.*[.]cash[.]'  -- no duplicates

ÉDITER:

Si vous souhaitez simplement remplacer la première occurrence, vous pouvez utiliser :

update t
    set path = regexp_replace(path, '.cash.', '.coin.')
    where path ~ '[.]cash[.]';
1
Gordon Linoff 4 nov. 2020 à 17:25