2017-05-16 4 views
1

Wie wähle ich die Umkehrung dieser Abfrage, und warum sind Fehler meine Versuche ...Wie wähle ich die Umkehrung dieser Abfrage?

Abfrage zu umkehren:

SELECT * FROM table_name 
where (category_id is null and product_id is null) or request_path like '%Portal%'; 

Mein Versuch:

SELECT * FROM table_name 
where 
(category_id is not null and product_id is not null) 
and request_path not like '%Portal%'; 

Wenn ich versuche, zählen () auf die Ergebnisse von jedem und addieren sie zusammen, ich bekomme nicht die Gesamtzahl () für jede Zeile. Es ist immer weniger als die Summe, also weiß ich, dass ich nicht die Umkehrung auswähle. Ich kann auch nicht beweisen, dass ich die Auswahl nicht verfälsche.

Angenommen, category_id und product_id können Ganzzahlen sein, request_path ist nie string.empty oder null.

Ich bin ein .net Programmierer. Ich könnte dies wahrscheinlich in linq ziemlich leicht tun, aber ich repariere eine mysql Datenbank. Straight SQL war schon immer meine Achillesferse.

+3

Sie haben 'Kategorie_ID ist nicht null' ** und ** 'Produkt_ID ist nicht null' nicht rückgängig gemacht. Machen Sie es 'category_id ist nicht null ODER Produkt-ID ist nicht null'. – ansh

+0

Und da ist es. – CarComp

+2

https://en.wikipedia.org/wiki/De_Morgan%27s_laws - Sie können aber auch 'where not (initial_condition)' –

Antwort

2

Transfering De Morgan's laws in SQL Sie folgende Regeln bekommen würde:

NOT (a AND b) = NOT a OR NOT b 
NOT (a OR b) = NOT a AND NOT b 

Deshalb sollten Sie and ersetzen müssen mit or

where (category_id is not null or product_id is not null) 
    and request_path not like '%Portal%' 

Aber ich würde schreiben Sie es auf folgende Weise:

where coalesce(category_id, product_id) is not null 
    and request_path not like '%Portal%' 

aktualisieren

Trinimons Kommentar ist richtig: Wenn die request_path NULLs enthalten kann, die richtige Umkehrung der

request_path like '%Portal%' 

sollte

(request_path not like '%Portal%' or request_path is null) 

sein, weil null not like 'anything' NULL zurück.

+1

verwenden Es gibt jedoch ein Problem: Was passiert für Zeilen, wo 'request_path'' null' ist? 'Null'-Werte sind weder' wie 'etwas' noch 'nicht wie' etwas '. Siehe http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx – Trinimon

+0

@Trinimon Sie' Richtig - Danke. –

Verwandte Themen