J'ai une table où dans une table appelée test qui ont 4 champ fields.one nommé comme une liste, j'ai 1,2,3,4,5,6 valeurs multiples séparées par une virgule, je dois vérifier si dans cette table et dans ce domaine particulier, un ID dit 4 est là ou pas .. par une requête sql.SQL complexe de requête
Répondre
Si vous devez trouver 4 et seulement 4 (et non 14 ou 24 ou 40, etc.), vous devez utiliser
SELECT * FROM foo WHERE col LIKE '%, 4,%'
ou
SELECT * FROM foo WHERE col LIKE '%,4,%'
s'il n'y a pas d'espace entre les virgules et les nombres
qui ne fonctionnera pas pour "4,5,6" ou juste "4" – Thilo
c'est vrai, mais personnellement dans cette situation, j'écrirais le code qui envoie la chaîne à la base de données pour inclure une virgule au début et à la fin - ou un espace au début et une virgule à la fin et supprimer la première virgule de la requête - pour que la requête fonctionne toujours. – AndrewDFrazier
Votre conception de base de données est incorrecte, c'est pourquoi vous avez des problèmes d'interrogation des données. Vous devriez avoir les valeurs dans un tableau séparé, de sorte que la valeur d'apprentissage est dans son propre domaine. Ensuite, il serait facile de trouver les dossiers:
select t.testId
from test t
inner join listing l on l.testId = t.testId
where l.id = 4
Maintenant, vous devez utiliser une comparaison de chaînes laides pour trouver les enregistrements:
select testId
from test
where ','+listing+',' like '%,4,%'
L'approche commune consiste à analyser la liste dans une variable de table ou une fonction table, puis vous vous joignez à la table ou utilisez une sous-requête EXISTS.
Il y a beaucoup d'exemples sur la façon de le faire:
http://www.bing.com/search?setmkt=en-US&q=SQL+parse+list+into+table
Cela suppose SQL Server, pas sûr d'autres SGBDR. – Brannon
Vous pouvez
SELECT *
FROM YourTable
WHERE REPLACE(Col, ' ', '') LIKE '4,%' --Starts with
OR REPLACE(Col, ' ', '') LIKE '%,4' --Ends with
OR REPLACE(Col, ' ', '') LIKE '%,4,%' --Contains
OR REPLACE(Col, ' ', '') = '4' --Equals
Tout comme une question d'intérêt, un coup d'oeil à ce
DECLARE @delimiter NVARCHAR(5),
@Val INT
SELECT @Val = 40
SELECT @delimiter = ','
DECLARE @YourTable TABLE(
ID INT,
Vals VARCHAR(50)
)
INSERT INTO @YourTable (ID,Vals) SELECT 1, '1,2,3,4,5,6,7,8'
DECLARE @TempTable TABLE(
ID INT,
Vals XML
)
INSERT INTO @TempTable
SELECT ID,
CAST('<d>' + REPLACE(Vals, @delimiter, '</d><d>') + '</d>' AS XML)
FROM @YourTable
SELECT *
FROM @TempTable tt
WHERE EXISTS(
SELECT T.split.value('.', 'nvarchar(max)') AS data
FROM tt.Vals.nodes('/d') T(split)
WHERE T.split.value('.', 'nvarchar(max)') = @Val
)
et ensuite vous devez tenir compte des espaces entre les virgules, .... +1 cependant. –
Vous n'avez pas à tenir compte des espaces entre les virgules, en supposant que le format exact est corrigé. – Thilo
@Thilo: vous êtes sur la bonne voie mais je ne compterais pas dessus. –
Vous pouvez utiliser une fonction instring dans la clause where et dans la clause select :
Oracle:
select substr(column, instr(column, '1', 1), 1)
where instr(column, '1', 1) > 0
fonctionne que si vous voulez une valeur unique. Vous pouvez également utiliser une combinaison de déclarations de cas ou de décodage pour créer une seule colonne pour chaque valeur possible:
select
decode(instr(column, '1', 1), 0, substr(column, instr(column, '1', 1), 1), null) c1,
decode(instr(column, '2', 1), 0, substr(column, instr(column, '2', 1), 1), null) c2,
decode(instr(column, '3', 1), 0, substr(column, instr(column, '3', 1), 1), null) c3
La beauté de cette approche pour un tel ensemble mal normalisé de données est que vous pouvez enregistrer comme vue et puis exécutez SQL sur cela, donc si vous enregistrez ce qui précède, vous pouvez utiliser:
select c1, c2 from view where c1 is not null or c2 is not null
NB. Dans d'autres dbms, vous devrez peut-être utiliser une syntaxe différente, éventuellement le cas plutôt que l'instruction de décodage
- 1. Aide requête SQL complexe
- 2. Requête complexe SQL
- 3. requête SQL complexe
- 4. complexe SQL requête de jointure
- 5. Besoin d'une requête SQL complexe
- 6. requête sql complexe aide nécessaire
- 7. Requête SQL avec sous-requête complexe
- 8. MySQL requête cache, requête SQL complexe
- 9. Problème de requête complexe LINQ to SQL
- 10. L'application exécute une requête SQL complexe
- 11. Soustraire complexe dans la requête SQL Server
- 12. complexe requête SQL, relation un à plusieurs
- 13. Aucune idée comment écrire requête SQL complexe
- 14. Aide avec la requête SQL complexe
- 15. Aide de requête Sql complexe. Forming query in SQL
- 16. Besoin d'aide dans la requête complexe sql
- 17. Complexe (ish) requête de jointure et de comptage SQL
- 18. Aide de requête SQLite complexe
- 19. pourcentage de couverture en utilisant une requête SQL complexe ...?
- 20. complexe requête Mysql
- 21. requête complexe dans Django
- 22. Requête complexe Mysql
- 23. requête arel complexe
- 24. Requête complexe dans mysql
- 25. Requête complexe avec Sphinx
- 26. Besoin d'aide pour une requête SQL complexe dans NHibernate
- 27. Comment interroger cette requête complexe dans T-SQL/Linq?
- 28. Erreur ORA-22813 avec une requête complexe SQL
- 29. requête SQL complexe à NHibernate DetachedCriteria ou HQL
- 30. SQL: suppression complexe
Quelle est la saveur de SQL? –
Django a un type de champ appelé CommaSeparatedIntegerField qui, selon moi, est stocké dans la base de données sous forme de texte. J'ai du mal à trouver comment fonctionne l'interaction avec la base de données pour ce genre de choses. –