Anti-Definite

Just a quick post to highlight a MySQL function I’ve created that I’m finding to be very useful (perhaps others will as well).

I love it when sorting ignores prefixes of ‘The’ or ‘A’ - definite or indefinite articles, if you want the correct terms. To get this happening within a SQL SELECT request is a bit tricky, but inspired by someone else’s solution (Ok, so I pretty much copied their code), I’ve created the following function to make it a lot easier:

CREATE FUNCTION ANTIDEFINITE(field VARCHAR(1024))
RETURNS VARCHAR(1024) DETERMINISTIC
  RETURN CASE
    WHEN SUBSTRING_INDEX(field, ' ', 1) IN ('a', 'an', 'the')
      THEN CONCAT(SUBSTRING(field, INSTR(field, ' ') + 1),
      ', ', SUBSTRING_INDEX(field, ' ', 1))
    ELSE field
  END;

It works in MySQL 5.0 and 5.1 - I’m sure something similar could be concocted for Postgres.

To use, just call the function on whichever fields you want in your order clause, such as:

SELECT *
FROM posts
ORDER BY ANTIDEFINITE(subject);

Or, via Rails:

Post.find :all, :order => 'ANTIDEFINITE(subject)'

I’m not sold on the function name, though - it’s a bit long, but at least it’s clear. If you’ve got a better suggestion, let me know.