2014-06-27 15 views
8

Jak mogę zapytać w Kasandra dla! = Puste kolumny.SELECT w kassandra gdzie id! = Null

Select * from tableA where id != null; 
Select * from tableA where name != null; 

Następnie chciałem zapisać te wartości i wstawić je do różnych tabel.

+0

'gdzie id jest null'? 'null' jest specjalną wartością w bazach danych i jest zakaźne. wszelkie operacje wykonywane z wartością null są "zainfekowane", a wyniki stają się puste. nie możesz zrobić "null = null" i musisz użyć specjalnej składni 'is null'. –

+0

Czy wybierz * z tableA gdzie id = null; – user3780281

+0

'gdzie id nie jest równy zeru'. –

Odpowiedz

6

Nie sądzę, że jest to możliwe w przypadku Cassandry. Po pierwsze, Cassandra CQL nie obsługuje użycia NOT ani nie jest równa operatorom w klauzuli WHERE. Po drugie, klauzula WHERE może zawierać tylko kolumny klucza głównego, a kolumny klucza głównego nie zezwalają na wstawianie pustych wartości. Nie byłem pewien o średnich indeksów chociaż, więc wpadłem to szybki test:

create table nullTest (id text PRIMARY KEY, name text); 
INSERT INTO nullTest (id,name) VALUES ('1','bob'); 
INSERT INTO nullTest (id,name) VALUES ('2',null); 

teraz mam stół i dwa rzędy (jedna z danych null):

SELECT * FROM nullTest; 

id | name 
----+------ 
    2 | null 
    1 | bob 

(2 rows) 

I spróbuj utwórz dodatkowy indeks na nazwę, o której wiem, że zawiera wartości null.

CREATE INDEX nullTestIdx ON nullTest(name); 

Pozwala mi to zrobić. Teraz uruchomię zapytanie dotyczące tego indeksu.

SELECT * FROM nullTest WHERE name=null; 
Bad Request: Unsupported null value for indexed column name 

I znowu, odbywa się to zgodnie z założeniem, że nie może zapytać o nie null, jeśli nie można nawet zapytać o wartości kolumn, które mogą rzeczywiście być null.

Myślę, że nie da się tego zrobić. Ponadto, jeśli wartości null są możliwe w kluczu podstawowym, możesz chcieć ponownie ocenić swój model danych. Ponownie, wiem, że pytanie OP dotyczy kwerendy, gdzie dane są nie null. Ale jak wspomniałem wcześniej, Cassandra CQL nie ma operatora NOT ani! =, Więc to będzie problem.

Inną opcją jest wstawianie pustego ciągu znaków zamiast pustego. Będziesz wtedy mógł zapytać o pusty ciąg znaków. Ale to nadal nie przeszkadza ci w podstawowej wadliwości projektowania posiadania wartości zerowej w polu klucza podstawowego. Być może, jeśli masz złożony klucz podstawowy, a tylko jego część (kolumny skupiające) ma możliwość bycia pustym (z pewnością nie jest częścią klucza partycjonowania). Ale nadal utknąłby problem polegający na tym, że nie można wyszukiwać wierszy, które nie są puste (zamiast wartości "null").

UWAGA: Wstawianie wartości pustych zostało wykonane tutaj wyłącznie w celach demonstracyjnych. Jest to coś, co powinieneś zrobić najlepiej, aby uniknąć, ponieważ wstawienie wartości kolumny NULE BĘDZIE stworzyć nagrobek. Podobnie, wstawianie partii wartości null stworzy wiele nagrobków.

1

1) wybierz * z testu;

name    | id | address 
------------------+----+------------------ 
    bangalore | 3 |  ramyam_lab 
    bangalore | 4 | bangalore_ramyam 
    bangalore | 5 |  jasgdjgkj 
     prasad | 11 |    null 
     prasad | 12 |    null 
     india | 6 |   karnata 
     india | 7 |   karnata 
ramyam-bangalore | 3 |  jasgdjgkj 
ramyam-bangalore | 5 |  jasgdjgkj 

2) Cassandra nie obsługuje wyboru wartości pustych. Wskazuje wartość null dla naszego zrozumienia.

3) służy do obsługi wartości null użyć innego ciągi jak "nie-available", "null", to możemy wybrać dane