Three ways:
One: write trigger on the table.
CREATE OR REPLACE FUNCTION foo_trigger_func() RETURNS OPAQUE AS '
BEGIN
NEW.email := LOWER(NEW.email);
RETURN NEW;
END;' LANGUAGE 'plpgsql';
CREATE TRIGGER foo_trigger BEFORE INSERT OR UPDATE ON foo
FOR EACH ROW EXECUTE PROCEDURE foo_trigger_func();
Two: use the lower function in your update and insert queries
INSERT INTO foo VALUES(LOWER(email),'Name');
Three: Postgresql has an ILIKE operator
You could play with that but not the best solution
HTH
Darren Ferguson
On Fri, 24 May 2002, Russell Black wrote:
> I'm using email addresses as a primary key in one of my tables. Currently, I have to ensure that the email addresses
areconverted to lower case before they get put into the table, and that all lookups on that field are converted to
lowercase before the select statement, in order to ensure that Joe@Somewhere.com is the same as joe@somewhere.com.
>
> Does anyone know of a case-insensitive data type? I'd want the following behavior:
>
> /* Make the primary key be a case-insensitive data type */
> CREATE TABLE foo (email CASE_INSENSITIVE_VARCHAR(50) PRIMARY KEY, name VARCHAR(50));
>
> /* Insert a row with a case insensitive key */
> INSERT INTO foo VALUES ('joe@somewhere.com', 'Joe');
> INSERT 24751 1
>
> /* A different case of an existing primary key should fail */
> INSERT INTO foo VALUES ('Joe@SOMEWHERE.com', 'Joe');
> ERROR: Cannot insert a duplicate key into unique index foo_pkey
>
> /* A lookup on a different case of an existing key should be successful: */
> SELECT * FROM foo WHERE email = 'Joe@SOMEWHERE.com';
> email | name
> -------------------+------
> joe@somewhere.com | Joe
> (1 row)
>
> Anyone know how I can accomplish this? Can I create a custom data type to do this?
>
> Thanks, Russell
>
>
>