Naja, der Ansatz mit dem where ist doch schon gut. Du willst ja nur die Werte aus Tupeln aufsummieren, die bestimmte Eigenschaften nicht haben. Also so in der Art:
obelisk.asterisk hat geschrieben:Kann man so etwas auch mit einem REGEXP lösen und nur bestimmte Telefonnummern herrausfiltern?
Wenn deine Datenbank reguläre Ausdrücke in der SELECT-Syntax unterstützt geht das. Schau einfach mal in die Dokumentation deines Datenbanksystems.
Auf eine Datenbank mit regulären Ausdrücken oder auch mit LIKE '%WERT%' zuzugreifen ist allerdings etwas, was man möglichst vermeiden will. Für solche Anfragen muss die DB jedesmal einen Full-Table-Scan durchführen, da ein Index nicht benutzt werden kann. Wenn man irgendwie Möglichkeiten sieht das ganze durch eine andere Struktur vermeiden zu können oder zumindest die Kosten durch die Angabe einer zusätzlichen Bedingung (auf die dann natürlich per Index zugegriffen werden sollen könnte) zu reduzieren, dann sollte man das auf jeden Fall machen.
Idealerweise sollte man die Telefonnummern vorher zerlegen, und in den internationalen Teil, das Netz bzw. die Vorwahl und den Rest auftrennen. Dann ließe sich das einfacher bewerkstelligen.
sql3 = """SELECT COUNT(blabla) FROM tttt WHERE ziel REGEXP '^0[1-9].* | ^[1-9].*' AND ziel NOT REGEX '^01[5-7].*|^112.*|^118.*|^0700.*|0800.*|^0137.*|^0180.*' AND (calldate >= CURRENT_DATE - INTERVAL 10 DAY)"""
cursor.execute(sql3)
"Funktioniert nicht" oder "liefert falsche Werte" sind keine vernünftigen Fehlerbeschreibungen Du musst schon sagen, was du als Ergebnis erwartest und was tatsächlich rauskommt. Hast du die einzelnen Teile der Anfrage auch mal einzeln getestet? So kannst du den Fehler zumindest eingrenzen.
Sebastian
Tip: man kann Ausdrücke auch zusammenfassen, dann schrumpft der letze wohl fast auf die Hälfte der Länge.
Als erstes: Rede mal mit demjenigen der die Datenstruktur verbrochen hat und schau mal ob sich das nicht wirklich in irgendetwas umstellen lässt wo die regulären Ausdrücke nicht mehr bzw. nicht mehr in der Menge benötigt werden.