Re: [GENERAL] Selecting Varchar range (through JDBC). - Mailing list pgsql-jdbc

From Daryl Beattie
Subject Re: [GENERAL] Selecting Varchar range (through JDBC).
Date
Msg-id 4160E6FC08ABD21191F000805F857E9304DF462A@mail.markham.insystems.com
Whole thread Raw
Responses Re: [GENERAL] Selecting Varchar range (through JDBC).
List pgsql-jdbc
Dear PostgreSQL people,

    Thanks for your help from before, Vince. I didn't get around to
attempting to implement that varchar range function until last night, and
when I did I ran into some problems. Whenever I tried to execute the
statement:

SELECT ArtistId FROM Artist WHERE SortName ~*
'[[.testArtist1.]-[.testArtist2.]].*'

    I get the following JDBC error:

javax.ejb.FinderException: SQLException while finding Artists:
java.sql.SQLException: ERROR:  Invalid regular expression: invalid collating
element

    The SQLException is coming from the database, however, it MAY be a
JDBC driver issue with it not escaping the statement properly.
    My suspicion, however, is that I'm simply not using the regular
expressions correctly. Can anybody kindly explain to me how to do this
correctly? (I am trying to search a varchar range, for example, any Artists
whose names start with the letters A to C.)
    I have attached my Java code to the bottom of this e-mail for
reference.
    For your convenience, here's the link to the idocs that describes
regex functionality in PostgreSQL:
http://www.postgresql.org/idocs/index.php?functions-matching.html#FUNCTIONS-
REGEXP

Sincerely,

    Daryl.

P.S. Some notes:
    - I'm using PostgreSQL 7.2.1 on RH Linux 7.2, and the latest binary
PostgreSQL JDBC driver.
    - It doesn't matter what I put in the [. .], it never seems to work
any better. For example, a good test would be WHERE SortName ~*
'[[.A.]-[.C.]].*'
    - I tried using a straight Statement-from-a-query-string that I
constructed instead of a PreparedStatement (to bypass any automatic escaping
done by the PreparedStatement), and got the same results.


> -----Original Message-----
> From: Vince Vielhaber [mailto:vev@michvhf.com]
> Sent: Monday, August 12, 2002 8:49 AM
> To: Daryl Beattie
> Cc: pgsql-general@postgresql.org
> Subject: Re: [GENERAL] Selecting Varchar range.
>
>
> On Mon, 12 Aug 2002, Daryl Beattie wrote:
>
> > Dear PostgreSQL people,
> >
> >     I didn't find this in the archives or the idocs, so...
> >
> >     How does one select a varchar range? The meaning of my
> question is
> > best illustrated by the following completely hypothetical
> and totally
> > imaginary situation:
> >     Let's say I have a table of musical artists:
> >
> > CREATE TABLE Artists (
> >     Id SERIAL PRIMARY KEY,
> >     Name VARCHAR(100)
> > );
> >
> >     And I want to eventually display only the artists from
> 'Aa' to 'Am'.
> > Naturally doing a select where Name like 'A%' will not
> return me what I
> > want.
> >     Any ides on how to do this? [Will "SELECT Name FROM
> Artists WHERE
> > Name > 'Aa%' AND Name < 'Am%';" work?]
> >
> >     Bonus question: How do I select artists whose names start with a
> > number?
>
> Think REGEX.    A[a-m]%   [0-9]%
>
> If any of your artists are indies, send them to www.unknown-artists.com
>
> Vince.





/**
 * Finds all of the Artists whose sort-names fall within a particular range,
 * and returns them in a Collection. An example of this would be to ask for
 * all of the artists that are within "Aa" and "Cz", and it would return all
 * the Artists that start with A, B, and C. Case is ignored for the search,
 * but <i>be careful</i> because some bands could start with numbers!
 *
 * @param start The start String of the Artists we want to find.
 * @param end The end String of the Artists we want to find.
 * @return A Collection containing all the Artists whose sort-names fall
 * within a particular range.
 * @throws FinderException If there was a problem finding such Artists.
 */
public Collection ejbFindArtistsWhoseSortNamesAreWithin(String start, String
end) throws FinderException {
    ArrayList artists = new ArrayList(); // All of the Artists.
    Connection dbConnection = null;      // The database connection.
    PreparedStatement ps = null;         // The statement(s) to execute.
    ResultSet resultSet = null;          // The results of the query.

    if ((start.indexOf("-") > 0) || (start.indexOf("[") > 0) ||
(start.indexOf("]") > 0) || (end.indexOf("-") > 0) || (end.indexOf("[") > 0)
|| (end.indexOf("]") > 0)) throw new FinderException("The start and end
strings for findArtistsWhoseSortNamesAreWithin() cannot have '-', '[' or ']'
in them.");
    if ((start == null) || ("".equals(start)) || (end == null) ||
("".equals(end))) return artists;

    // STEP 1: Get the database connection.
    try { dbConnection = getConnection(); } catch (Exception e) { throw
new EJBException(e.getMessage()); }

    // STEP 2: Find the Artists.
    try {
        String queryStr = "SELECT " + DatabaseNames.ARTIST_ID + "
FROM " +
                DatabaseNames.ARTIST_TABLE + " WHERE " +
                DatabaseNames.ARTIST_SORTNAME + " ~* ?";
        ps = dbConnection.prepareStatement(queryStr);
        ps.setString(1, "[[." + start + ".]-[." + end + ".]].*");
        resultSet = ps.executeQuery();
        ArtistPK artistPK = null;
        while (resultSet.next()) {
            artistPK = new ArtistPK();

artistPK.setId(resultSet.getInt(DatabaseNames.ARTIST_ID));
            artists.add(artistPK);
        }
    }
    catch(SQLException e) {
        context.setRollbackOnly();
        throw new FinderException("SQLException while finding
Artists:\n" + e);
    }
    finally {
        try { closeResultSet(resultSet); } catch (Exception e) {
log.warning("Failed to close ResultSet: " + e.getMessage()); }
        try { closeStatement(ps); } catch (Exception e) {
log.warning("Failed to close Statement: " + e.getMessage()); }
        try { closeConnection(dbConnection); } catch (Exception e) {
log.warning("Failed to close Connection: " + e.getMessage()); }
    }

    // STEP 3: Return that Collection of ArtistPKs.
    return artists;
}

pgsql-jdbc by date:

Previous
From: "xaos"
Date:
Subject: uPortal
Next
From: Thomas O'Dowd
Date:
Subject: Re: [GENERAL] Selecting Varchar range (through JDBC).