2008-09-30 5 views
3

É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 chiffres sont séparés slash_ids ... Comment feriez-vous un mettre à jour l'instruction avec SQL qui dirait: "si le widget_ids de la rangée avec l'id X contient le texte" somenumber/"ne fait rien, sinon ajoute" somenumber/"à sa valeur courante"Champ de mise à jour Sqlite s'il contient

Pouvez-vous faire quelque chose comme ça avec SQL, ou plus spécifiquement, sqlite? Est-ce quelque chose qui est mieux fait dans le programme pour une raison quelconque ou est-il un soutien pour la syntaxe "si-alors" en SQL?

Répondre

7

Les mises à jour sont un peu comme si-elles-mêmes, et il y a aussi un support de type if-then dans la plupart des implémentations SQL. Une solution simple peut ê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/%"; 
3

D'abord, supprimez la liste séparée par des symboles. 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ées par un slash:

INSERT INTO ThingieWidgets (thingie_id, widget_id) 
    VALUES (1234, 67), (1234, 797), (1234, 124); 

Vous pouvez maintenant tester si Thingie 1234 références Widget 45:

SELECT * FROM ThingieWidgets 
WHERE thingie_id = 1234 AND widget_id = 45; 

Vous pouvez essayer d'insérer et récupérer s'il y a une erreur de clé en double:

INSERT INTO ThingieWidgets (thingie_id, widget_id) 
    VALUES (1234, 45); 
+0

Bons points, mais malheureusement, sqlite n'a pas vraiment de support pour l'application de la clé étrangère. – foobar

+0

D'accord, vous ne pouvez pas déclarer les clés étrangères, mais il est toujours préférable de séparer la chaîne séparée par des barres obliques dans une table normalisée. –

+0

Vous avez raison, et j'étais sur le point de le faire jusqu'à ce qu'il me frappe que tout ce que je faisais était entièrement inutile. Le message que j'ai marqué a répondu à ma question comme je l'ai demandé, mais s'il y avait un soutien pour un tel, je l'aurais marqué comme «de soutien» ou quoi que ce soit. Je l'ai fait modéliser cependant ... – foobar

Questions connexes