2017-08-22 1 views
2

J'ai du mal à "googler" celui-ci, mais j'espère que ce n'est pas trop compliqué pour un expert (ou même un intermédiaire).Bibliothèque SQLite et persistance des salles: comment combiner les conditions IN et LIKE?

Existe-t-il un moyen de rechercher une sous-chaîne dans un nombre inconnu de plusieurs conditions OU?

La requête originale pour la chambre SQLite Android Persistance OAC est:

SELECT country FROM table WHERE country IN (:searchList) 

qui, étant donné un ListeRecherche de [ 'Paris, France', 'Berlin, Allemagne'] se traduirait par le SQL:

SELECT country FROM table WHERE country IN ('Paris, France', 'Berlin, Germany'); 

Et renverrait: [ 'Paris, France', 'Berlin, Allemagne']

Cependant, je voudrais être en mesure de rechercher par tout le pays. Par exemple, étant donné une liste de recherche de ['France', 'Allemagne'], je n'ai malheureusement aucun résultat.

Je comprends l'instruction SQL suivante ferait l'affaire:

SELECT country FROM table WHERE country LIKE '%France%' OR country LIKE '%Germany%'; 

Cependant, parce que je ne sais pas combien d'éléments seraient dans LISTERECHERCHEE, je dois utiliser le format d'origine:

SELECT country FROM table WHERE country IN (:searchList) 

Est-il possible de faire la recherche ci-dessus pour une sous-chaîne dans la colonne de pays?

Un grand merci pour votre aide,

Dan

+0

Depuis androïdes SQLite (version) ne supporte pas regexp dans la requête de recherche vous pouvez vouloir diviser la liste (: ListeRecherche) à des mots simples à la place? Exemple: https://stackoverflow.com/questions/41678776/substring-for-sqlite-android –

+0

J'espérais éviter de scinder searchList, car alors je devais effectuer plusieurs appels à la DB - un pour chaque élément de searchList . – danwag

Répondre

1

Depuis androïdes SQLite est pas livré avec Regex, vous devrez diviser la liste avant de le fouiller.

SQLite IN-Operator trie votre liste et utilise une recherche binaire qui est de loin plus rapide que l'utilisation de requêtes uniques pour ce cas.

Performance OU vs pour comparer la vitesse (malheureusement pas pour les requêtes de traitement par lots)

SELECT COUNT(*) FROM t_inner WHERE val IN (1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000); 
1 row fetched in 0.0032 (1.2679 seconds) 

SELECT COUNT(*) FROM t_inner WHERE val = 1000 OR val = 2000 OR val = 3000 OR val = 4000 OR val = 5000 OR val = 6000 OR val = 7000 OR val = 8000 OR val = 9000; 
1 row fetched in 0.0026 (1.7385 seconds) 
+0

Merci pour votre réponse. C'est dommage cependant :) Je suppose que je vais ajouter une ligne de pays pour chaque entrée, donc un UID serait lié à la fois à "Berlin, Allemagne" et "Allemagne". – danwag

+0

Oui, je sais, mais c'est Room .. Je l'utilise pour de très grands projets et sa stabilité jusqu'à présent, mais cela ne signifie pas que son final maintenant ;-) Il y a quelques ports de Sqlite qui supporte regex. –

+0

Vous voudrez peut-être comparer la vitesse si vous obtenez tous les résultats ou au moins en bunchwise et utiliser une sélection/filtre après. –