Обсуждение: SQL Where LIKE - Range it!
H- I've found the docs on how to select a list of rows from a table were all the records have a last name starting with 'W%'. select * from table where last_name LIKE 'W%' What I'd like to do is pull a list of records where there is a range of last names; say from A - F. select * from table where last_name LIKE 'A%' AND last_name LIKE 'F%' - for example. The above code I've tried for this doesn't seem to work as I'd expect it too? I've even done select * from table where last_name LIKE 'A%' AND LIKE 'F%' Can anyone provide some details or insights on how to accomplish this? Thanks. Much appreciated. -Steagus
Oops. That should have been: last_name >='A' and last_name<'G' (not <=) Calvin -- Calvin Dodge Certified Linux Bigot (tm) http://www.caldodge.fpcc.net
select * from table where last_name ~ '^[A-F]';
or
select * from table where last_name between 'A' and 'G';
or
select * from table where last_name >='A' and last_name<'G'
The second one is broken if last_name='G' returns something.
Use ~* in first example to ignore case.
Frank
At 08:16 PM 4/26/01 GMT, you wrote:
>H-
>
>I've found the docs on how to select a list of rows from a table were
>all the records have a last name starting with 'W%'.
>select * from table where last_name LIKE 'W%'
>
>What I'd like to do is pull a list of records where there is a range
>of last names; say from A - F.
>select * from table where last_name LIKE 'A%' AND last_name LIKE 'F%'
>- for example.
>
>The above code I've tried for this doesn't seem to work as I'd expect
>it too?
>I've even done
>select * from table where last_name LIKE 'A%' AND LIKE 'F%'
>
>Can anyone provide some details or insights on how to accomplish this?
>
>
>Thanks. Much appreciated.
>-Steagus
>
>
>---------------------------(end of broadcast)---------------------------
>TIP 6: Have you searched our list archives?
>
>http://www.postgresql.org/search.mpl
>
On Thu, 26 Apr 2001, Steagus wrote: > > What I'd like to do is pull a list of records where there is a range > of last names; say from A - F. > select * from table where last_name LIKE 'A%' AND last_name LIKE 'F%' > - for example. > > The above code I've tried for this doesn't seem to work as I'd expect > it too? > I've even done > select * from table where last_name LIKE 'A%' AND LIKE 'F%' > > Can anyone provide some details or insights on how to accomplish this? LIKE A% AND LIKE F% means "must start with A *AND* must start with F", so the name "Anderson" would fail because it does start with A, but doesn't start with F. Something like LIKE "A%" OR LIKE "B%" OR LIKE "C%" ... OR LIKE "F%" would do the trick, but slowly, and it's a pain to write out. I'd use BETWEEN 'A' AND 'FZZZ' (or, to be more precise, >='A' and <'G') Keep in mind that PostgreSQL is case-sensitive, so if me name were 'Joel deBurton', you wouldn't find me. If you have lower-case starting names, you'll want to see (BETWEEN 'A' AND 'FZZZ') OR (BETWEEN 'a' AND 'fzzz') HTH, -- Joel Burton <jburton@scw.org> Director of Information Systems, Support Center of Washington
> What I'd like to do is pull a list of records where there is a range > of last names; say from A - F. > select * from table where last_name LIKE 'A%' AND last_name LIKE 'F%' > - for example. > > The above code I've tried for this doesn't seem to work as I'd expect > it too? When you use the AND boolean operator, you are asking for records that match BOTH boolean expressions. And I don't know many words that start with A *and* F. :) You want to use the OR operator: SELECT * FROM table_name WHERE last_name LIKE 'A%' OR last_name LIKE 'F%' > Can anyone provide some details or insights on how to accomplish this? If you want a range, you'll have to use a regular expression (or a whole bunch of LIKE expressions for every value in the range. A regular expression version would be: SELECT * FROM table_name WHERE last_name ~ '^[A-F]' The tilde (~) tells it to match on a regular expression, the carat (^) tells it to match the beginning of the string, the brackets match a single character, and the A-F matches one letter in that range. Hope this helps! Greg