MySQL insert() and instr() equiv

Started by Mark Constablealmost 20 years ago7 messagesgeneral
Jump to latest
#1Mark Constable
markc@renta.net

When using MySQL I have one select that uses MySQL functions so I am
wondering about the best way to go to end up with the same result in
PostgreSQL.

uid is an email address stored in the passwd table as user@domain.com
and this construct allows an incoming username such as "user.domain.com"
to be compared to the stored "user@domain.com".

SELECT wpath FROM passwd WHERE uid="\L" OR insert(uid,instr(uid,'@'),1,'.')="\L"

--markc

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Mark Constable (#1)
Re: MySQL insert() and instr() equiv

Mark Constable <markc@renta.net> writes:

uid is an email address stored in the passwd table as user@domain.com
and this construct allows an incoming username such as "user.domain.com"
to be compared to the stored "user@domain.com".
SELECT wpath FROM passwd WHERE uid="\L" OR insert(uid,instr(uid,'@'),1,'.')="\L"

Well, if you want to write it exactly that way you'd need to write
insert() and instr() functions, which would probably take about five
minutes in any reasonably decent string-mashing language such as plperl.
You could do it in plpgsql but it'd be more painful. (There's an
example of coding instr() in the back of the plpgsql manual chapter,
but it's intended to match Oracle's version of instr() which might not
be quite like MySQL's.)

But, if you're not wedded to that particular way, why not use replace()?

SELECT wpath FROM passwd WHERE uid="\L" OR replace(uid, '@', '.')="\L"

regards, tom lane

#3Michael Fuhr
mike@fuhr.org
In reply to: Mark Constable (#1)
Re: MySQL insert() and instr() equiv

On Sun, Jun 18, 2006 at 02:06:28AM +1000, Mark Constable wrote:

When using MySQL I have one select that uses MySQL functions so I am
wondering about the best way to go to end up with the same result in
PostgreSQL.

You might be interested in the MySQL Compatibility Functions:

http://pgfoundry.org/projects/mysqlcompat/

uid is an email address stored in the passwd table as user@domain.com
and this construct allows an incoming username such as "user.domain.com"
to be compared to the stored "user@domain.com".

SELECT wpath FROM passwd WHERE uid="\L" OR insert(uid,instr(uid,'@'),1,'.')="\L"

The compatibility functions mentioned above can do this. See also
"String Functions and Operators" in the documentation:

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

Example:

overlay(uid PLACING '.' FROM position('@' IN uid) FOR 1)

In 8.1 you could use regexp_replace:

regexp_replace(uid, '@', '.')

For more complex searching and/or replacing you could write a
function in PL/Perl, PL/Python, etc.

--
Michael Fuhr

#4Mark Constable
markc@renta.net
In reply to: Tom Lane (#2)
Re: MySQL insert() and instr() equiv

On Sunday 18 June 2006 02:33, Tom Lane wrote:

uid is an email address stored in the passwd table as user@domain.com
and this construct allows an incoming username such as "user.domain.com"
to be compared to the stored "user@domain.com".

But, if you're not wedded to that particular way, why not use replace()?

I only decided to ditch MySQL tonight so I'm within the first
1/2 dozen hours of using pgsql for almost the first time. I've
lost a fair amount of hair with the basics of db and user setup
and close to burnout.

SELECT wpath FROM passwd WHERE uid="\L" OR replace(uid, '@', '.')="\L"

Excellent. Just the double quotes needed to be changed to single
quotes to avoid this error and replace() indeed works for my needs.

ERROR: column "user.domain.com" does not exist

Another anti-burnout question, how would I turn on the ability
to view any SQL requests in the logfile ?

No doubt there is an answer in the list archives somewhere but
my first few searches brought up nothing useful.

--markc

#5Bruno Wolff III
bruno@wolff.to
In reply to: Mark Constable (#4)
Re: MySQL insert() and instr() equiv

On Sun, Jun 18, 2006 at 04:18:23 +1000,
Mark Constable <markc@renta.net> wrote:

Another anti-burnout question, how would I turn on the ability
to view any SQL requests in the logfile ?

I think this section of the manual will answer your question:
http://developer.postgresql.org/docs/postgres/runtime-config-logging.html
(Though note I pointed you to the developer version, it might be different
from what applies to the version of Postgre you are running.)

No doubt there is an answer in the list archives somewhere but
my first few searches brought up nothing useful.

The manual that comes with Postgres is very good. Normally I would suggest
looking at it first, before trying to search the archives.

#6Marco Bizzarri
marco.bizzarri@gmail.com
In reply to: Mark Constable (#4)
Re: MySQL insert() and instr() equiv

Not sure this is the right answer: in older version you could enable
it via the postgresql.conf file, modifing the variable log_statement
and setting that to true. Also, you should check the syslog level
variable in the same file.

Regards
Marco

On 6/17/06, Mark Constable <markc@renta.net> wrote:

On Sunday 18 June 2006 02:33, Tom Lane wrote:

uid is an email address stored in the passwd table as user@domain.com
and this construct allows an incoming username such as "user.domain.com"
to be compared to the stored "user@domain.com".

But, if you're not wedded to that particular way, why not use replace()?

I only decided to ditch MySQL tonight so I'm within the first
1/2 dozen hours of using pgsql for almost the first time. I've
lost a fair amount of hair with the basics of db and user setup
and close to burnout.

SELECT wpath FROM passwd WHERE uid="\L" OR replace(uid, '@', '.')="\L"

Excellent. Just the double quotes needed to be changed to single
quotes to avoid this error and replace() indeed works for my needs.

ERROR: column "user.domain.com" does not exist

Another anti-burnout question, how would I turn on the ability
to view any SQL requests in the logfile ?

No doubt there is an answer in the list archives somewhere but
my first few searches brought up nothing useful.

--markc

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

http://www.postgresql.org/docs/faq

--
Marco Bizzarri
http://notenotturne.blogspot.com/

#7Jim Nasby
Jim.Nasby@BlueTreble.com
In reply to: Mark Constable (#4)
Re: MySQL insert() and instr() equiv

On Jun 17, 2006, at 1:18 PM, Mark Constable wrote:

On Sunday 18 June 2006 02:33, Tom Lane wrote:

uid is an email address stored in the passwd table as
user@domain.com
and this construct allows an incoming username such as
"user.domain.com"
to be compared to the stored "user@domain.com".

But, if you're not wedded to that particular way, why not use
replace()?

I only decided to ditch MySQL tonight so I'm within the first
1/2 dozen hours of using pgsql for almost the first time. I've
lost a fair amount of hair with the basics of db and user setup
and close to burnout.

You should hop on the IRC channel (#postgresql on irc.freenode.net).
There's almost always people on, and it's a great way to get help.
--
Jim C. Nasby, Sr. Engineering Consultant jnasby@pervasive.com
Pervasive Software http://pervasive.com work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf cell: 512-569-9461