2012-03-28 5 views
16

Die LIKE Bedingung ermöglicht es uns, Platzhalterzeichen in der WHERE-Klausel einer SQL-Anweisung zu verwenden. Dies ermöglicht uns, einen Mustervergleich durchzuführen. Die LIKE-Bedingung kann in jeder gültigen SQL-Anweisung verwendet werden - Auswählen, Einfügen, Aktualisieren oder Löschen. Gefallen Sie dieseGibt es irgendeine Abfrage für Cassandra wie SQL: LIKE Condition?

SELECT * FROM users 
WHERE user_name like 'babu%'; 

wie die gleiche obige Operation ist jede Abfrage für Cassandra in CLI zur Verfügung.

+0

sdolgy hat recht. Alternativ können Sie in etwas wie Solandra oder DSE schauen. – phact

Antwort

11

Einfache Antwort: Es gibt kein Äquivalent von LIKE

http://www.datastax.com/docs/0.8/dml/using_cql

Hier ist die Befehlsreferenz für v0.8:

http://www.datastax.com/docs/0.8/references/cql#cql-reference

Wenn Sie einen anderen Satz von Zeilen halten das hält Verweise auf einen Benutzernamen:

Zeile : Benutzername: bab -> col: babu1, col: babar row: Benutzername: babu -> col: babur

Effektiv betrügen Sie, indem Sie alle Ergebnisse vorbelegen, mit denen Sie normalerweise in der RDBMS-Welt suchen würden . Speicher ist billig im Vergleich zu dem, was es vor Jahren war ... deshalb ist dies jetzt ein akzeptierter Ansatz. Es ist weniger intensiv auf der CPU und dem Speicher, um eine vorab ausgefüllte Liste von Informationen abzurufen.

+2

Ich würde diese Antwort nicht als akzeptiert markieren. Tatsächlich gibt es einen Ersatz für LIKE 'something%', wenn die Spalte, die Sie filtern, ein Clusterschlüssel ist: SELECT * FROM Benutzer WHERE Benutzername <= 'Babu' AND Benutzername> 'babv'; Siehe @ PhilippBlums Antwort – Yahor

11

Ich weiß: Es ist eine alte Frage, aber es gibt eine Lösung für dieses Thema:

Sie können nicht wie Operator in cassandra verwenden, aber können Sie Bereich Operatoren und mit dem Bereichsoperator können Sie lösen dieses „wie 'whatever%' "

Ein Beispiel: Ich habe mehr als ein Produkt. Jedes Produkt hat seinen eigenen Partition Schlüssel (erster Teil des Primärschlüssels):

CREATE TABLE user(productId int, username text, PRIMARY KEY(productId, username)); 

Jetzt habe ich einige Benutzer:

INSERT INTO user(productId, username) VALUES (1, 'anna'); 
INSERT INTO user(productId, username) VALUES (1, 'alpha'); 
INSERT INTO user(productId, username) VALUES (1, 'andreas'); 
INSERT INTO user(productId, username) VALUES (1, 'alex'); 
INSERT INTO user(productId, username) VALUES (1, 'bernd'); 
INSERT INTO user(productId, username) VALUES (1, 'bob'); 

Nun, ich möchte alle Benutzer finden, die einen a hat bei der Anfang. In einer SQL-Welt verwenden i LIKE 'a%' in Cassandra verwende ich diese:

SELECT * FROM user WHERE productId = 1 AND username > 'a' AND username < 'b'; 

Das Ergebnis:

productid | username 
-----------+---------- 
    1 |  alex 
    1 | alpha 
    1 | andreas 
    1 |  anna 
+1

Aber diese Lösung kann nicht für längere Strings verwendet werden –

+0

@Mayerz wie lange? –

+0

wie wenn ich nach Wörtern fragen möchte, wie soll ich das machen? Ich denke diese Lösung ist nicht gut, oder? –

13

Seit Cassandra 3.4 (3.5 empfohlen), LIKE Abfragen erreicht werden kann, eine SSTable mit Angehängter Sekundärindex (SASI).

Zum Beispiel:

CREATE TABLE cycling.cyclist_name ( 
    id UUID PRIMARY KEY, 
    lastname text, 
    firstname text 
); 

die SASI Erstellen Sie wie folgt vor:

CREATE CUSTOM INDEX fn_prefix ON cyclist_name (firstname) 
USING 'org.apache.cassandra.index.sasi.SASIIndex'; 

Dann wird ein Präfix LIKE Abfrage funktioniert:

SELECT * FROM cyclist_name WHERE firstname LIKE 'M%'; 
SELECT * FROM cyclist_name WHERE firstname LIKE 'Mic%'; 

Diese Beispiele und mehr Konfigurationsoptionen, wie Suffixabfragen, finden Sie in der documentation

Eine genauere Erklärung, wie SASI funktioniert, finden Sie unter here.

Verwandte Themen