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 - code>. Donc, un exemple de valeur de ligne pourrait regarder 1-42-9 code>. Je veux faire une sélection de sorte que chaque chaîne entre le - code> soit remplacée par une autre selon une logique. À titre d'exemple, disons que ma logique indique que chaque chaîne égale à 42 code> doit être remplacée par abc code> qui me donnerait 1-abc-9 code> . Cela peut-il être fait dans une instruction code> code>? p>
4 Réponses :
Utilisation de au lieu de la valeur statique de SUBSTRIND CODE> et CASE CODE>, vous pouvez faire quelque chose comme ce qui suit: '1-42-9' code>, vous devez écrire le nom de la colonne. P> p>
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;
Si la colonne contient une valeur comme Ces 4 cas peuvent être manipulés avec une méthode plus compliquée mais précise: p> voir le Démo . Les résultats sont les suivants: p> '1-42-9' code> et que vous souhaitez rechercher '42 ' code> pour remplacer par ' abc '< / code>, alors vous devez prendre en compte tous les cas tels que:
'42 ' code> est au début de la colonne li>
'42 ' code> est au milieu de la colonne li>
'42 ' code> est à la fin de la colonne li>
'42 ' code> est la seule valeur de la colonne li>
ul>
Pour ces valeurs: p>
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 code>? 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é.
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
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 code>. 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! :)