2017-08-22 4 views
2

Ich habe Schwierigkeiten, dieses "Googeln", aber hoffentlich ist es nicht zu schwierig für einen Experten (oder sogar ein Zwischenprodukt).SQLite und Room Persistence Library: Wie IN Zustand und LIKE kombinieren?

Gibt es eine Möglichkeit, nach einer Teilzeichenfolge innerhalb einer unbekannten Anzahl von mehreren OR-Bedingungen zu suchen?

Die ursprüngliche Abfrage für die Android SQLite Raum Persistence DAO ist:

SELECT country FROM table WHERE country IN (:searchList) 

Welche, da ein search von [ 'Paris, Frankreich', 'Berlin, Deutschland'] zum SQL übersetzen würde:

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

Und zurückkehren würde: [ 'Paris, Frankreich', 'Berlin, Deutschland']

Allerdings würde Ich mag nur um das Land suchen kann. Bei einer Suchliste von ['France', 'Germany'] zum Beispiel bekomme ich leider kein Ergebnis.

Ich verstehe die folgende SQL den Trick tun würde:

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

jedoch, weil ich weiß nicht, wie viele Elemente in der search wäre, muss ich das Original-Format verwenden:

SELECT country FROM table WHERE country IN (:searchList) 

Gibt es eine Möglichkeit, die obige Suche nach einem Teilstring innerhalb der Spalte Land zu machen?

Vielen Dank für Ihre Hilfe,

Dan

+0

Seit Androiden SQLite (Version) nicht regexp in der Suchanfrage unterstützen möchten können Sie die Liste aufzuspalten (: search) zu einzelnen Wörtern stattdessen? Beispiel: https://stackoverflow.com/questions/41678776/substring-for-sqlite-android –

+0

Ich hatte gehofft zu vermeiden, searchList zu teilen, denn dann müsste ich mehrere Aufrufe an die DB - eine für jedes Element der searchList . – danwag

Antwort

1

Seit Androids SQLite nicht mit Regex müssen Sie spalten die Liste versandt wird, bevor Sie danach suchen.

SQLite IN-Operator sortiert Ihre Liste und eine binäre Suche verwenden, die bei weitem schneller als für diesen Fall einzelne Abfragen.

Leistung oder vs in der Geschwindigkeit (leider nicht für die Batch-Abfragen) zu vergleichen

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

Vielen Dank für Ihre Antwort. Das ist eine Schande aber :) Ich denke, was ich tun werde, ist eine Länderzeile für jeden Eintrag hinzufügen, so würde eine UID sowohl mit "Berlin, Deutschland" und "Deutschland" verknüpft werden. – danwag

+0

Ja ich weiß, aber das ist Zimmer .. Ich benutze es für sehr große Projekte und es ist so weit stabil, aber das bedeutet nicht, dass es jetzt endgültig ist ;-) Es gibt einige Ports von Sqlite, die Regex unterstützen. –

+0

Sie können die Geschwindigkeit messen, wenn Sie alle Ergebnisse oder zumindest bündelweise erhalten und eine Auswahl/Filter danach verwenden. –

Verwandte Themen