Champ de mise à jour SQLite s'il contient
Question
Étant donné un champ de base de données nommé "widget_ids", contenant des données telles que "67/797/124 /" ou "45 /", où les nombres sont séparés par des barres obliques widget_ids ... comment feriez-vous une instruction de mise à jour avec SQL qui dirait: "si les widgets_id de la ligne portant l'identifiant X contiennent le texte" somenumber / " ne rien faire, sinon ajoutez " somenumber / " à sa valeur actuelle ""
Pouvez-vous faire quelque chose comme ça avec SQL, ou plus précisément sqlite? Est-ce quelque chose de mieux à faire dans le programme pour une raison quelconque ou existe-t-il un soutien pour "if-then"? comme la syntaxe SQL?
La solution
Les mises à jour sont un peu comme si elles étaient elles-mêmes, et la plupart des implémentations SQL prennent en charge si et alors. Une solution simple pourrait être:
update <tablename>
set widget_id = widget_id + "somenumber/"
where row_id = X
and widget_id not like "%/somenumber/%"
and widget_id not like "somenumber/%";
Autres conseils
Tout d’abord, supprimez la liste des symboles séparés. Utilisez une autre table, avec un identifiant de widget par ligne.
CREATE TABLE ThingieWidgets (
thingie_id INT REFERENCES Thingies,
widget_id INT REFERENCES Widgets,
PRIMARY KEY(thingie_id, widget_id)
);
Remplissez le tableau avec les valeurs de la liste séparée par des barres obliques:
INSERT INTO ThingieWidgets (thingie_id, widget_id)
VALUES (1234, 67), (1234, 797), (1234, 124);
Vous pouvez maintenant tester si Thingie 1234 fait référence au widget 45:
SELECT * FROM ThingieWidgets
WHERE thingie_id = 1234 AND widget_id = 45;
Vous pouvez essayer d'insérer et de récupérer en cas d'erreur de clé en double:
INSERT INTO ThingieWidgets (thingie_id, widget_id)
VALUES (1234, 45);