Querying for strings that match after prefix

Started by badlydrawnbhoyalmost 20 years ago10 messagesgeneral
Jump to latest
#1badlydrawnbhoy
badlydrawnbhoy@gmail.com

Hi all,

I hope this is the right forum for this, but please correct me if
somewhere else is more appropriate.

I need to locate all the entries in a table that match , but only after
a number of characters have been ignored. I have a table of email
addresses, and someone else has erroneously entered some addresses
prefixed with 'mailto:', which I'd like to ignore.

An example would be: john.smith@smiths.com should match
mailto:john.smith@smiths.com

I've tried the following

select address
from people
where address = (select replace(address, 'mailto:', '') from people);

which gives me the error

ERROR: more than one row returned by a subquery used as an expression

I'm running on PostgreSQL 7.4.7

Thanks in advance,

BBB

#2Joachim Wieland
joe@mcknight.de
In reply to: badlydrawnbhoy (#1)
Re: Querying for strings that match after prefix

On Fri, Jun 02, 2006 at 02:47:22AM -0700, badlydrawnbhoy wrote:

I need to locate all the entries in a table that match , but only after
a number of characters have been ignored. I have a table of email
addresses, and someone else has erroneously entered some addresses
prefixed with 'mailto:', which I'd like to ignore.

Look here:

http://www.postgresql.org/docs/7.4/interactive/functions-string.html

especially the substring function will help you.

Joachim
PS: You should also consider upgrading to 7.4.13

#3John Sidney-Woollett
johnsw@wardbrook.com
In reply to: badlydrawnbhoy (#1)
Re: Querying for strings that match after prefix

Do you mean?

select replace(address, 'mailto:', '') from people

... and if you only want to find the ones that start with "mailto:"

select replace(address, 'mailto:', '') from people
where address like 'mailto:%'

John

badlydrawnbhoy wrote:

Show quoted text

Hi all,

I hope this is the right forum for this, but please correct me if
somewhere else is more appropriate.

I need to locate all the entries in a table that match , but only after
a number of characters have been ignored. I have a table of email
addresses, and someone else has erroneously entered some addresses
prefixed with 'mailto:', which I'd like to ignore.

An example would be: john.smith@smiths.com should match
mailto:john.smith@smiths.com

I've tried the following

select address
from people
where address = (select replace(address, 'mailto:', '') from people);

which gives me the error

ERROR: more than one row returned by a subquery used as an expression

I'm running on PostgreSQL 7.4.7

Thanks in advance,

BBB

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

#4John Sidney-Woollett
johnsw@wardbrook.com
In reply to: John Sidney-Woollett (#3)
Re: Querying for strings that match after prefix

Or something like

select ltrim(substr(address, 8)) from people
where address like 'mailto:%'
union
select address from people
where address not like 'mailto:%'

John

John Sidney-Woollett wrote:

Show quoted text

Do you mean?

select replace(address, 'mailto:', '') from people

... and if you only want to find the ones that start with "mailto:"

select replace(address, 'mailto:', '') from people
where address like 'mailto:%'

John

badlydrawnbhoy wrote:

Hi all,

I hope this is the right forum for this, but please correct me if
somewhere else is more appropriate.

I need to locate all the entries in a table that match , but only after
a number of characters have been ignored. I have a table of email
addresses, and someone else has erroneously entered some addresses
prefixed with 'mailto:', which I'd like to ignore.

An example would be: john.smith@smiths.com should match
mailto:john.smith@smiths.com

I've tried the following

select address
from people
where address = (select replace(address, 'mailto:', '') from people);

which gives me the error

ERROR: more than one row returned by a subquery used as an expression

I'm running on PostgreSQL 7.4.7

Thanks in advance,

BBB

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

#5badlydrawnbhoy
badlydrawnbhoy@gmail.com
In reply to: John Sidney-Woollett (#3)
Re: Querying for strings that match after prefix

Hi there,

I think I need to explain a bit further.

I tried simply using

update people
replace(address, 'mailto:','');

but unfortunately that produced a duplicate key error as some of the
addresses prefixed with 'mailto:' are already present (unprefixed) in
the table.

So what I need to do is find those entries - those items in the table
for which there is an equivalent entry prefixed with 'mailto:'.

Sorry if I'm not being very clear!

Cheers

BBB

John Sidney-Woollett wrote:

Show quoted text

Do you mean?

select replace(address, 'mailto:', '') from people

... and if you only want to find the ones that start with "mailto:"

select replace(address, 'mailto:', '') from people
where address like 'mailto:%'

John

badlydrawnbhoy wrote:

Hi all,

I hope this is the right forum for this, but please correct me if
somewhere else is more appropriate.

I need to locate all the entries in a table that match , but only after
a number of characters have been ignored. I have a table of email
addresses, and someone else has erroneously entered some addresses
prefixed with 'mailto:', which I'd like to ignore.

An example would be: john.smith@smiths.com should match
mailto:john.smith@smiths.com

I've tried the following

select address
from people
where address = (select replace(address, 'mailto:', '') from people);

which gives me the error

ERROR: more than one row returned by a subquery used as an expression

I'm running on PostgreSQL 7.4.7

Thanks in advance,

BBB

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

#6brian
brian@zijn-digital.com
In reply to: John Sidney-Woollett (#4)
Re: Querying for strings that match after prefix

John Sidney-Woollett wrote:

I need to locate all the entries in a table that match , but only
after a number of characters have been ignored. I have a table of
email addresses, and someone else has erroneously entered some
addresses prefixed with 'mailto:', which I'd like to ignore.

Or something like

select ltrim(substr(address, 8)) from people where address like
'mailto:%' union select address from people where address not like
'mailto:%'

Could you explain why the UNION?

brian

#7John Sidney-Woollett
johnsw@wardbrook.com
In reply to: brian (#6)
Re: Querying for strings that match after prefix

1) select ltrim(substr(address, 8)) from people
where address like 'mailto:%'

gives all addresses that start with "mailto:" but first strips off the
prefix leaving only the email address

2) select address from people where address not like 'mailto:%'

produces all email address that don't need the prefix stripped off

The UNION of the two gives you all the unique/distinct addresses by
combining the results from the first and second query.

John

brian ally wrote:

Show quoted text

John Sidney-Woollett wrote:

I need to locate all the entries in a table that match , but only
after a number of characters have been ignored. I have a table of
email addresses, and someone else has erroneously entered some
addresses prefixed with 'mailto:', which I'd like to ignore.

Or something like

select ltrim(substr(address, 8)) from people where address like
'mailto:%' union select address from people where address not like
'mailto:%'

Could you explain why the UNION?

brian

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

#8brian
brian@zijn-digital.com
In reply to: John Sidney-Woollett (#7)
Re: Querying for strings that match after prefix

John Sidney-Woollett wrote:

brian ally wrote:

John Sidney-Woollett wrote:

I need to locate all the entries in a table that match , but
only after a number of characters have been ignored. I have a
table of email addresses, and someone else has erroneously
entered some addresses prefixed with 'mailto:', which I'd
like to ignore.

Or something like

select ltrim(substr(address, 8)) from people where address like
'mailto:%' union select address from people where address not
like 'mailto:%'

Could you explain why the UNION?

brian

1) select ltrim(substr(address, 8)) from people where address like
'mailto:%'

gives all addresses that start with "mailto:" but first strips off
the prefix leaving only the email address

2) select address from people where address not like 'mailto:%'

produces all email address that don't need the prefix stripped off

The UNION of the two gives you all the unique/distinct addresses by
combining the results from the first and second query.

Right, of course. I'd forgotten that the original query was not simply
to select the bad addresses, but to grab them all. Thanks for the
clarification.

brian

#9Joe Brenner
doom@kzsu.stanford.edu
In reply to: badlydrawnbhoy (#1)
Re: Querying for strings that match after prefix

badlydrawnbhoy <badlydrawnbhoy@gmail.com> wrote:

I hope this is the right forum for this, but please correct me if
somewhere else is more appropriate.

I need to locate all the entries in a table that match , but only after
a number of characters have been ignored. I have a table of email
addresses, and someone else has erroneously entered some addresses
prefixed with 'mailto:', which I'd like to ignore.

An example would be: john.smith@smiths.com should match
mailto:john.smith@smiths.com

I've tried the following

select address
from people
where address = (select replace(address, 'mailto:', '') from people);

which gives me the error

ERROR: more than one row returned by a subquery used as an expression

There's no need to use a sub-select for this, this should do the job:

SELECT REPLACE(address, 'mailto:', '') FROM people;

You also have some options for "fuzzy" matching in the WHERE clause, e.g.

SELECT address FROM people WHERE address LIKE '%doom@%'

Will find all email addresses like "doom@...", whether or not there's a
'mailto:' prefix. (% matches any character string).

This will find all the records with the erroneous "mailto:" prefix:

SELECT address FROM people WHERE address LIKE 'mailto:%'

#10Roman Neuhauser
neuhauser@sigpipe.cz
In reply to: badlydrawnbhoy (#5)
Re: Querying for strings that match after prefix

# badlydrawnbhoy@gmail.com / 2006-06-02 05:18:08 -0700:

I think I need to explain a bit further.

I tried simply using

update people
replace(address, 'mailto:','');

but unfortunately that produced a duplicate key error as some of the
addresses prefixed with 'mailto:' are already present (unprefixed) in
the table.

So what I need to do is find those entries - those items in the table
for which there is an equivalent entry prefixed with 'mailto:'.

Sorry if I'm not being very clear!

Not unclear, this question is a completely different animal.

Pick one:

SELECT p.*
FROM people p,
(SELECT REPLACE(address, 'mailto:', '') AS stripped
FROM people
WHERE address LIKE 'mailto:%') AS m
WHERE p.address = m.stripped;

SELECT *
FROM people p
WHERE p.address IN (
SELECT REPLACE(address, 'mailto:', '') AS stripped
FROM people
WHERE address LIKE 'mailto:%');

--
How many Vietnam vets does it take to screw in a light bulb?
You don't know, man. You don't KNOW.
Cause you weren't THERE. http://bash.org/?255991