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?

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top