Problem mit and und or

Hallo,

ich bin kein SQL-Profi und was PG angeht weiss ich noch weniger. Die unten stehende Abfrage ist aus Not entstanden und funktioniert fast wie gewollt aber eben nur fast.
Der Sinn der Abfrage besteht darin einen Textstring auf das vorkommen bestimmter Teilstrings zu untersuchen und nur bestimmte Zeilen zu liefern.
Für das Design der Datenbank bin ich nicht verantwortlich und kann da auch ncihts ändern. Der problematische Teil ist fett markiert. Sobald dies in die Abfrage aufgenommen wird funktioniert sie nicht mehr richtig. (Die Zeile die mit 00178331 anfängt dürfte nicht als Ergebnis der Abfrage auftauchen, tut sie jedoch nachdem der fett markierte Teil hinzugefügt wird.)

Abfrage:
select cdr_e164, local_stamp ,cdrp_call_flow
from cdr_properties, cdrs
where cdr_properties.cdr_id = cdrs.id
and device = ‘AMT’
and cdr_dir = ‘from’
and cdrp_call_flow like ‘%{setup-from,#72%’
and cdrp_call_flow like ‘%conn-to,600%’
and cdrp_call_flow not like ‘%conn-to,11%’
and cdrp_call_flow not like ‘%conn-to,10%’
and (cdrp_call_flow not like ‘%connected,26%’ or cdrp_call_flow not like ‘%connected,27%’)
and local_stamp::timestamp::date = ‘2013-04-18’;

Ausgabe:
cdr_e164 | local_stamp | cdrp_call_flow
--------------±--------------------±----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
00236123xxx | 2013-04-18 09:05:40 | {{from,00236123xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{disc-from,},{rel-to,600,Zentrale,Zentrale-Alere},{disc-to,}}
00236123xxx | 2013-04-18 09:10:18 | {{from,00236123xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{disc-from,},{rel-to,600,Zentrale,Zentrale-Alere},{disc-to,}}
00306734xxx | 2013-04-18 10:18:03 | {{from,00306734xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{disc-from,},{rel-to,600,Zentrale,Zentrale-Alere},{disc-to,}}
001783318xxx | 2013-04-18 10:29:13 | {{from,001783318xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{transfer-to,600,},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{transfer-to,113,Agent4,},{alert-to,600,Zentrale,},{conn-to,600,Zentrale,},{transfer-to,261,},{connected,261,},{disc-from,},{rel-to,261,}}
00221271xxx | 2013-04-18 12:01:11 | {{from,00221271xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{disc-from,},{rel-to,600,Zentrale,Zentrale-Alere},{disc-to,}}
(5 Zeilen)


Hoffe ihr könmnt mir weiter helfen.


Vielen Dank

Marius

Bist Dir sicher, daß Du ein OR NOT LIKE willst?

test=*# select '001783318xxx | 2013-04-18 10:29:13 | {{from,001783318xxx,,AMT},{setup-from,#72,,},{cf-to,#74,,},{conn-to,#74,BestellungQueue,BestellungQueue},{transfer-to,600,,},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{transfer-to,113,Agent4,},{alert-to,600,Zentrale,},{conn-to,600,Zentrale,},{transfer-to,261,,},{connected,261,,},{disc-from,,,},{rel-to,261,,}}' not like  '%connected,27%';
 ?column?
----------
 t
(1 row)
 Das match halt auf alles AUßER '%connected,27% und da via OR verknüpft erfüllt es halt das WHERE

Wenn Du so fragst, nein bin ich nicht. Was spricht dagegen?

Verstehe leider nicht was du meinst. Ich hab sonst nur selten was mit SQL zu tun und wenn dann eher mit MySQL. Kenntnisse habe ich nur aus meiner Ausbildungszeit und von ab und an mit MySQL rumspielen :slight_smile:

Was ich brauche ist eine Abfrage die folgendes macht:

Alle Einträge für ein bestimmtes Datum auflisten die folgende Kriterien erfüllen:

Device=‘AMT’
cdr_dir = ‘from’
cdrp_call_flow beinhaltet folgende Teilstrings (UND): ‘{setup-from,#72’,‘conn-to,600’,‘conn-to,11’,‘conn-to,10’
folgende Teilstrings dürfen nicht in cdrp_call_flow vorhanden sein: ‘connected,26’,‘connected,27’

Ich darf aber keine Rufnummern als Kriterium für die Suche verwenden da ich die nicht kenne, und wenn ich deine Antwort mit meinen beschränkten Kenntnissen verstehe, wird ja genau das gemacht.

Schöne Grüße

Marius

Ich versuche zu übersetzen!
Versuche mal:
select
‘001783318xxx | 2013-04-18 10:29:13 | {{from,001783318xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{transfer-to,600,},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{transfer-to,113,Agent4,},{alert-to,600,Zentrale,},{conn-to,600,Zentrale,},{transfer-to,261,},{connected,261,},{disc-from,},{rel-to,261,}}’ not like ‘%connected,27%’,
‘001783318xxx | 2013-04-18 10:29:13 | {{from,001783318xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{transfer-to,600,},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{transfer-to,113,Agent4,},{alert-to,600,Zentrale,},{conn-to,600,Zentrale,},{transfer-to,261,},{connected,261,},{disc-from,},{rel-to,261,}}’ not like ‘%connected,26%’,
‘001783318xxx | 2013-04-18 10:29:13 | {{from,001783318xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{transfer-to,600,},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{transfer-to,113,Agent4,},{alert-to,600,Zentrale,},{conn-to,600,Zentrale,},{transfer-to,261,},{connected,261,},{disc-from,},{rel-to,261,}}’ not like ‘%connected,26%’
OR
‘001783318xxx | 2013-04-18 10:29:13 | {{from,001783318xxx,AMT},{setup-from,#72,},{cf-to,#74,},{conn-to,#74,BestellungQueue,BestellungQueue},{transfer-to,600,},{alert-to,600,Zentrale,Zentrale-Alere},{conn-to,600,Zentrale,Zentrale-Alere},{transfer-to,113,Agent4,},{alert-to,600,Zentrale,},{conn-to,600,Zentrale,},{transfer-to,261,},{connected,261,},{disc-from,},{rel-to,261,}}’ not like ‘%connected,27%’;

Ergibt t, f, t
genauso wie:
select true, false, not true or not false;

Also was statt OR nehmen?