0
votes

Remplacer partiellement des chaînes dans SQL

Je me demande si je peux faire ce qui suit directement dans SQL. J'ai une colonne formatée de texte avec des valeurs séparées par - . Donc, un exemple de valeur de ligne pourrait regarder 1-42-9 . Je veux faire une sélection de sorte que chaque chaîne entre le - soit remplacée par une autre selon une logique. À titre d'exemple, disons que ma logique indique que chaque chaîne égale à 42 doit être remplacée par abc qui me donnerait 1-abc-9 . Cela peut-il être fait dans une instruction ?


5 commentaires

Vous pouvez envisager d'utiliser la fonction SQL Remplacer (). Jetez un coup d'œil à Ce


Merci pour la réponse rapide. Disons qu'une valeur ressemble à 1-11-111 . Si j'utilise Remplacer, comment puis-je distinguer entre 1, 11 et 111?


Vous pouvez remplacer -11- avec -abc-, par exemple


Utilisez-vous SQLite? Il a un ensemble de fonctions très limitées


@Alexyes, oui, j'utilise SQLite pour plusieurs raisons, mais je suis au courant des limitations. Merci d'avoir souligné cela! :)


4 Réponses :


0
votes

Utilisation de SUBSTRIND et CASE , vous pouvez faire quelque chose comme ce qui suit: xxx

au lieu de la valeur statique de '1-42-9' , vous devez écrire le nom de la colonne.


0 commentaires

0
votes

peut-il être fait dans une instruction SELECT? P>

Oui, vous pouvez utiliser le Remplacer la fonction P>

Pour faire, le 1 Remplacer Vous pouvez utiliser: - P>

SELECT
    CASE 
      WHEN instr(mycolumn,'-42-') THEN replace(mycolumn,'-42-','ABC')
      WHEN instr(mycolumn,'-43-') THEN replace(mycolumn,'-43-','DEF')
      WHEN instr(mycolumn,'-44-') THEN replace(mycolumn,'-44-','GHI')
      ELSE mycolumn
  END AS mycolumn
FROM mytable;

0 commentaires

2
votes

Si la colonne contient une valeur comme '1-42-9' et que vous souhaitez rechercher '42 ' pour remplacer par ' abc '< / code>, alors vous devez prendre en compte tous les cas tels que:

  • '42 ' est au début de la colonne
  • '42 ' est au milieu de la colonne
  • '42 ' est à la fin de la colonne
  • '42 ' est la seule valeur de la colonne

    Ces 4 cas peuvent être manipulés avec une méthode plus compliquée mais précise: xxx

    voir le Démo .
    Pour ces valeurs: xxx

    Les résultats sont les suivants: xxx


2 commentaires

C'est intéressant. Comment régleriez-vous le code dans une situation où il y a quatre chiffres dans chaque ligne? Par exemple. 1-32-5-61 ? Et comment allez-vous ajouter plusieurs conditions en une fois? De sorte que, par exemple, les 1s sont remplacés par un, 32s avec B, vaut la peine de mentionner, c'est qu'il n'y a pas de situation où il n'y a qu'une seule valeur dans chaque ligne. Toutes les lignes ont le format Number-Number-Number-Number-Number-Number-Number (code> et les numéros sont soit 1 à 2 chiffres. Merci.


Le code fonctionne pour n'importe quel nombre de chiffres et peu importe si elles sont 1 ou 2 chiffres ou plus, si vous voulez 1 remplacement. Pour 2 remplaçants ou plus en même temps, il devient compliqué.



0
votes

La solution dynamique compatible SQLite serait de nier les fonctions Substr et Instrice pour diviser la liste en éléments, puis appliquer la logique de remplacement sur des éléments.

pour une table Cordes code> qui comporte des colonnes ID code> avec des valeurs '1-42-9' code>, '777-5-21' code> et '7-55-123' (vous êtes donc sûr que cela fonctionne avec des longueurs variables des éléments et des couvre 1 code> vs 111 code> case), ce serait: p>

SELECT
 input 
,first_element || '-' ||
 CASE second_element 
    WHEN '42' THEN 'ABC'
    WHEN '5' THEN 'DEF'
    ELSE second_element
 END || '-' ||
 third_element as output
FROM (
    select 
    id as input,
    substr(
      id,
      1,
      instr(id,'-')-1
    ) as first_element,             
    substr(
      substr(id,instr(id,'-')+1,100),
      1,
      instr(substr(id,instr(id,'-')+1,100),'-')-1
    ) as second_element
    ,substr(
      substr(id,instr(id,'-')+1,100),
      instr(substr(id,instr(id,'-')+1,100),'-')+1,
      100
    ) as third_element
    from strings
) t       


0 commentaires