Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Nummern ermitteln die eine Teilnummer enthalten (https://www.delphipraxis.net/123625-nummern-ermitteln-die-eine-teilnummer-enthalten.html)

barnti 5. Nov 2008 15:08

Datenbank: Oracle • Version: 10 • Zugriff über: PL/SQL

Nummern ermitteln die eine Teilnummer enthalten
 
Hallo,

ich möchte folgende Abfrage realisieren: In der einen Tabelle stehen Telefonnummern incl. Vorwahl in einer anderen Tabelle nur Vorwahlen. Ich möchte nun in der der Vorwahl-Tabelle bestimmte Einträge mit einem Flag versehen und alle Rufnummern aus der Telefonnummern-Tabelle bekommen, die mit dieser geflagten Vorwahl beginnen. Mit dem IN-Operator habe ich es nicht hinbekommen like funktioniert nur mit einem Datensatz:

SQL-Code:
SELECT * FROM TELEFONNUMMERN
WHERE TELEFONNUMMER LIKE
SELECT Concat(PREFIX,'%') FROM PREFIX_TABLE
Was nicht wirklich ausführbar ist. Durch das Subselect bekomme ich einen String zurück, den ich mit einem Like vergleichen könnte. Nur wie genau? Hat jemand einen Plan für mich?

mkinzler 5. Nov 2008 15:33

Re: Nummern ermitteln die eine Teilnummer enthalten
 
SQL-Code:
SELECT * FROM TELEFONNUMMERN
WHERE TELEFONNUMMER LIKE
(SELECT Concat(PREFIX,'%') FROM PREFIX_TABLE);
sollte funktionieren

nahpets 5. Nov 2008 15:42

Re: Nummern ermitteln die eine Teilnummer enthalten
 
Hallo,

wie sehen Deine Telefonnummern aus?
Alle in einem einheitlichen Format?

z. B.: 089/12345679 oder 08912345678 oder +498912345678 oder?

SQL-Code:
SELECT * FROM TELEFONNUMMERN
WHERE TELEFONNUMMER LIKE
(SELECT Concat(PREFIX,'%') FROM PREFIX_TABLE);
dürfte nicht funktionieren, da das innere Select mehr als einen Datensatz liefert und damit ein Vergleich auf < = > != like ... scheitert.

nahpets 5. Nov 2008 16:33

Re: Nummern ermitteln die eine Teilnummer enthalten
 
Hallo,
davon ausgehend, dass in Telefonnummer die Vorwahl immer durch / vom Rest getrennt ist, könnte sowas in der Art funktionieren.
SQL-Code:
select * from (
  select left(TELEFONNUMMER ,instr(TELEFONNUMMER,'/',1)) as Vorwahl from TELEFONNUMMERN
) x, PREFIX_TABLE a
where x.Vorwahl = a.PREFIX
and  a.flag = 'gesetzt'
oder auch so:
SQL-Code:
select * from TELEFONNUMMERN, PREFIX_TABLE
where instr(TELEFONNUMMERN.TELEFONNUMMER,'/',1) = PREFIX_TABLE.PREFIX
and  PREFIX_TABLE.flag = 'gesetzt'
eventuell ginge es aber auch so, wobei hier keine (sichtbare) Trennung zwischen Vorwahl und übriger Rufnummer vorhanden sein muss:
SQL-Code:
select * from TELEFONNUMMERN, PREFIX_TABLE
where left(TELEFONNUMMERN.TELEFONNUMMER,lenght(PREFIX_TABLE.PREFIX)) = PREFIX_TABLE.PREFIX
and  PREFIX_TABLE.flag = 'gesetzt'
(nur hingeschrieben, nicht getestet)

barnti 6. Nov 2008 09:29

Re: Nummern ermitteln die eine Teilnummer enthalten
 
Moin,

meine Telefonnummern liegen ohne Trennzeichen vor. Daher ist Dein letzter Vorschlag der richtige Wink. Ich habe das noch ein wenig abgeändert:
SQL-Code:
SELECT * 
  FROM TELEFONNUMMERN m, PREFIX p
 WHERE LPAD(m.startnumber,LENGTH(p.PREFIX),0) = p.PREFIX
   AND p.exportday = (SELECT TO_CHAR(SYSDATE,'D')FROM DUAL);
Mit dem Statement werden so alle Einträge aus der Telefonnummern-Tabelle exportiert, die in der Prefix-Tabelle den aktuellen TAg als Exporttag haben.

Vielen Dank für eure Hilfe!

alzaimar 6. Nov 2008 09:57

Re: Nummern ermitteln die eine Teilnummer enthalten
 
Allgemein sollte das so gehen:
SQL-Code:
select * 
  From Nummern n
    join Prefixe p
      on n.Telefonnummer like p.prefix+'%'
So kann im Gegensatz zu LPAD, denke ich, auch ein Index verwendet werden.

barnti 6. Nov 2008 10:51

Re: Nummern ermitteln die eine Teilnummer enthalten
 
Hallo,

da ich im Moment Probleme bei der Laufzeit des ersten vorgeschlagenen Statements habe, würde ich den Join gern versuchen:

SQL-Code:
select *
  From Nummern n
    join Prefixe p
      on n.Telefonnummer like p.prefix+'%'
Allerdings muss ich die Bedingung

SQL-Code:
 AND p.exportday = (SELECT TO_CHAR(SYSDATE,'D')FROM DUAL);
für den Tag noch mit aufnehmen. Aber schon das erste Statement oben bringt den Fehler:

Delphi-Quellcode:
ORA-01722: Ungültige Zahl

barnti 6. Nov 2008 10:55

Re: Nummern ermitteln die eine Teilnummer enthalten
 
Hi,

muss lauten:

SQL-Code:
SELECT p.prefix as Vorwahl,m.*
FROM TELEFONNUMMERN m, PREFIX p
WHERE m.startnumber like p.prefix || '%'

alzaimar 6. Nov 2008 10:56

Re: Nummern ermitteln die eine Teilnummer enthalten
 
Ah, '+' ist MSSQL ,'||' offensichtlich Oracle.

Ich würde Dir empfehlen, mit JOIN zu arbeiten und nicht mit deinem Konstrukt. Das ist fast das Gleiche aber Du wirst bei mehreren Tabellen u.u. Probleme bekommen.

barnti 6. Nov 2008 11:23

Re: Nummern ermitteln die eine Teilnummer enthalten
 
Hallo alzaimar,

ich habe Deinen Vorschlag beherzigt und die Oracle-Join-Syntax benutzt. Funktioniert und ist auch relativ schnell.

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz