Обсуждение: = or LIKE ?

Поиск
Список
Период
Сортировка

= or LIKE ?

От
Jesper Krogh
Дата:
Hi.

Can anyone explain me this behavior?

testdb=# select E'\\' = E'\\'; ?column?
---------- t
(1 row)

testdb=# select E'\\' like E'\\'; ?column?
---------- f
(1 row)


Shouldnt the like operator do the same as the = if there occours no 
wildcards and stuff in the string?

-- 
Jesper


Re: = or LIKE ?

От
Tom Lane
Дата:
Jesper Krogh <jesper@krogh.cc> writes:
> Shouldnt the like operator do the same as the = if there occours no 
> wildcards and stuff in the string?

If there are also no escape characters, then yeah.

FWIW, 8.4 will complain about this case:

regression=# select E'\\' like E'\\';
ERROR:  LIKE pattern must not end with escape character
        regards, tom lane


Re: = or LIKE ?

От
Jesper Krogh
Дата:
Tom Lane wrote:
> Jesper Krogh <jesper@krogh.cc> writes:
>> Shouldnt the like operator do the same as the = if there occours no 
>> wildcards and stuff in the string?
> 
> If there are also no escape characters, then yeah.
> 
> FWIW, 8.4 will complain about this case:
> 
> regression=# select E'\\' like E'\\';
> ERROR:  LIKE pattern must not end with escape character

So I cannot rely on the like operator to behave correct if I'd like to 
compare strings with backslashes (e.g. filepaths from MS Windows 
filesystems)?

I actually get the same if it doesnt end with the slashes:
testdb=# select E'\\t' like E'\\t'; ?column?
---------- f
(1 row)

testdb=# select E'\\t' = E'\\t'; ?column?
---------- t
(1 row)



-- 
Jesper


Re: = or LIKE ?

От
Jesper Krogh
Дата:
Jesper Krogh wrote:
> Tom Lane wrote:
>> Jesper Krogh <jesper@krogh.cc> writes:
>>> Shouldnt the like operator do the same as the = if there occours no 
>>> wildcards and stuff in the string?
>>
>> If there are also no escape characters, then yeah.
>>
>> FWIW, 8.4 will complain about this case:
>>
>> regression=# select E'\\' like E'\\';
>> ERROR:  LIKE pattern must not end with escape character
> 
> So I cannot rely on the like operator to behave correct if I'd like to 
> compare strings with backslashes (e.g. filepaths from MS Windows 
> filesystems)?
> 
> I actually get the same if it doesnt end with the slashes:
> testdb=# select E'\\t' like E'\\t';
>  ?column?
> ----------
>  f
> (1 row)
> 
> testdb=# select E'\\t' = E'\\t';
>  ?column?
> ----------
>  t
> (1 row)

Ok. The pattern has to be "double escaped"..

testdb=# select E'\\t' like E'\\\\t'; ?column?
---------- t
(1 row)


(for the archives a ref to the documentations i didnt get by the read 
through)
http://www.postgresql.org/docs/8.2/static/functions-matching.html#FUNCTIONS-LIKE

-- 
Jesper



Re: = or LIKE ?

От
Tom Lane
Дата:
Jesper Krogh <jesper@krogh.cc> writes:
> Ok. The pattern has to be "double escaped"..

Or specify a different escape character.
        regards, tom lane


Re: = or LIKE ?

От
Craig Ringer
Дата:
Jesper Krogh wrote:

> So I cannot rely on the like operator to behave correct if I'd like to 
> compare strings with backslashes (e.g. filepaths from MS Windows 
> filesystems)?

test=# SELECT E'\\' LIKE E'\\' ESCAPE ''; ?column?
---------- t
(1 row)

--
Craig Ringer