Thread: sql: "LIKE" problem

sql: "LIKE" problem

From
"Her Goo"
Date:
I am using "postgresql-7.3.2-1" now!

I met a problem when using "LIKE" in "WHERE" clause.
For example, a table named "t_test", and its data looks like below:

# SELECT * FROM t_test;id | c_name 
----+-------- 1 | abc\ 2 | abc\de
(2 rows)

The thing I want to do is searching in above table and restricting  
the results to those that begin with string "abc\". The search result is:

# SELECT * FROM t_test WHERE c_name LIKE 'abc\%';id | c_name 
----+-------- 1 | abc\ 2 | abc\de
(2 rows)

I want to go a step further, and  restrict the results to those 
that begin with string "abc\d". The search result is:

# SELECT * FROM t_test WHERE c_name LIKE 'abc\d%';id | c_name 
----+--------
(0 rows)

I don't know why the result is "0 rows"(why not is "1 rows"), 
And I have trid "LIKE 'abc\\d%'", the result is also "0 rows".

Is this a bug for "postgresql-7.3.2-1" ? 
Or how can I search a field when it contains a backslash('\') ?

Thanks!!!


Re: sql: "LIKE" problem

From
Tom Lane
Date:
"Her Goo" <gu_he@msn.com> writes:
> I want to go a step further, and  restrict the results to those 
> that begin with string "abc\d".

You need four backslashes for that, because \ is special to both
the string literal parser and the LIKE operator.  So '\\\\'
reduces to a string constant containing \\, and then the LIKE
operator sees that as a quoted backslash.
        regards, tom lane


Re: sql: "LIKE" problem

From
Richard Huxton
Date:
Her Goo wrote:
> I am using "postgresql-7.3.2-1" now!
> 
> I met a problem when using "LIKE" in "WHERE" clause.
> For example, a table named "t_test", and its data looks like below:
> 
> # SELECT * FROM t_test;
>  id | c_name 
> ----+--------
>   1 | abc\
>   2 | abc\de
> (2 rows)

> # SELECT * FROM t_test WHERE c_name LIKE 'abc\d%';
>  id | c_name 
> ----+--------
> (0 rows)
> 
> I don't know why the result is "0 rows"(why not is "1 rows"), 
> And I have trid "LIKE 'abc\\d%'", the result is also "0 rows".

You'll need to escape the backslash twice. Once for the SQL-level
parsing and once for the LIKE pattern-matching itself.

SELECT * FROM t_test WHERE c_name LIKE 'abc\\\\d%';

-- Richard Huxton Archonet Ltd