Обсуждение: Escaping underscores in LIKE
Am I doing something stupid trying to escape an underscore in LIKE? Version 7.1b3 richardh=> select * from foo; a ----- a_c a_d abc (3 rows) richardh=> select * from foo where a like 'a_c'; a ----- a_c abc (2 rows) richardh=> select * from foo where a like 'a\_c'; a ----- a_c abc (2 rows) richardh=> select * from foo where a like 'a\_c' escape '\\'; a ----- a_c abc (2 rows) richardh=> select * from foo where a like 'ax_c' escape 'x'; a ----- a_c (1 row) - Richard Huxton
dev@archonet.com writes:
> Am I doing something stupid trying to escape an underscore in LIKE?
You need more backslashes. Don't forget the string-literal parser eats
one level of backslashes, before LIKE ever gets to see the pattern.
regards, tom lane
From: "Tom Lane" <tgl@sss.pgh.pa.us> > dev@archonet.com writes: > > Am I doing something stupid trying to escape an underscore in LIKE? Ah so Yes. > You need more backslashes. Don't forget the string-literal parser eats > one level of backslashes, before LIKE ever gets to see the pattern. > > regards, tom lane Thanks Tom, as a 2-stage process it all makes sense. Tried it out in PHP too and I end up with four backslashes (3 stages). Another DOH! item for my notes. - Richard Huxton
"Richard Huxton" <dev@archonet.com> writes:
>> You need more backslashes. Don't forget the string-literal parser eats
>> one level of backslashes, before LIKE ever gets to see the pattern.
> Thanks Tom, as a 2-stage process it all makes sense. Tried it out in PHP too
> and I end up with four backslashes (3 stages).
> Another DOH! item for my notes.
BTW, in 7.1 you can do
foo LIKE 'a#_b' ESCAPE '#'
(for '#' use whatever you want) to switch to a different escape
character that's not special to upstream processing. Probably nicer
than dealing with four or more backslashes ...
regards, tom lane