subselect mit like

ich habe zwei tabellen:

table subdoms:
id/name

1 www.
2 mail.
3 ns.
4 dns usw

table hostnames
id/name

1 http://www.pgforum.de
2 mail.pgforum.de
3 admin.pgforum.de

nun würde ich gerne alle hostnames finden, die mit einem der einträge in subdom beginnen.

spontan ist mir “select hostname from hostnames where hostname ~(select name from subdoms)” eingefallen - das funktioniert aber aus naheliegenden gründen nicht.

Gibt es die Möglichkeit, IN mit LIKE zu kombinieren, oder hat sonst jemand eine Idee, wie ich diesen Query abwickeln könnte?

ts

ich nehm alles zurück - das funktioniert alles prima, wenn man nur IN gross schreibt.

manchmal finde ich konventionen einfach nervig… :slight_smile:

ts

zeigt mal bitte, anhand deiner genannten Tabellen, wie es geht.

Andreas

hihi - zu früh gefreut, es geht eben nicht.

meine idee war:

select hostnames.hostname from hostnames where hostname not in (select subdom from subdom)

aber das liefert nicht nur die “schlechten”, also nicht passenden ergebnisse, sondern alle zurück. man sollte mehr als die ersten 100 angucken…

das problem bleibt. EXISTS ?? hmmm.

thomas

gnoerz schrob am 4898. September 1993:

hihi - zu früh gefreut, es geht eben nicht.

meine idee war:

select hostnames.hostname from hostnames where hostname not in (select subdom from subdom)

Ich denke, du suchst

row_constructor operator ANY (subquery)

HTH
Andreas

Nö.

test=# select * from hostnames ;
 id |       name
----+------------------
  1 | www.pgforum.de
  2 | mail.pgforum.de
  3 | admin.pgforum.de
(3 rows)

Time: 1.447 ms
test=# select * from subdoms ;
 id | name
----+-------
  1 | www.
  2 | mail.
  3 | ns.
  4 | dns.
(4 rows)

Time: 1.314 ms
test=# select * from hostnames where regexp_replace(name, '\\..*$','') in (select regexp_replace(name, '\.$', '') from subdoms);
 id |      name
----+-----------------
  1 | www.pgforum.de
  2 | mail.pgforum.de
(2 rows)

Okay?

Andreas, der es einklich wie ansel machen wollt (bzw. mit arrays), aber nicht drauf kommt…

akretschmer schrob am 4898. September 1993:

test=# select * from hostnames where regexp_replace(name, ‘\…*$’,‘’) in (select regexp_replace(name, ‘.$’, ‘’) from subdoms);
id | name
----±----------------
1 | http://www.pgforum.de
2 | mail.pgforum.de
(2 rows)

Okay?

Andreas, der es einklich wie ansel machen wollt (bzw. mit
arrays), aber nicht drauf kommt…

:-). Für die Akten:

,----
| scratch=> select hostname from hostnames where name ~ any (select name from subdoms);

hostname
http://www.pgforum.de
mail.pgforum.de
(2 rows)
`----

Gruß
Andreas

Autsch. Ich bild mir ein, exakt das auch versucht zu haben. Fipptehler meinerseits wohl, daß ich einen error bekam…

Andreas

mit ANY hab ich das so nicht hingekriegt - es hat aber eine Menge anderer Probleme gelöst - in diesem Sinne erstmal heissen Dank!

Die regexe sind tricky, passen aber nicht unbedingt, weil die hostnamen nicht immer konsistent sind, sondern zwischen einem und 10 punkten haben… :slight_smile: - sonst bräuchte ich ja die tld-tabelle nicht :slight_smile:


Thomas