Sorting on one of two columns in database

Hi, all. I've got a list of jobs I'm trying to sort based on the
'location' column. The location column is actually filled in by a
method in the location model, and it's "name" if the locations.name
column is not null, otherwise it's locations.address.

So, the long and short is that I'd like to figure out how to do this
in my job_controller.rb:

sort_jobs_by = 'locations.name if locations.name is not null,
otherwise use locations.address'

@jobs = Job.find(:all, :order => sort_jobs_by, :include => [:location])

Of course, "locations.name if locations.name is not null, otherwise
use locations.address" is not exactly valid SQL, and so that won't
work. I need to know what to set sort_jobs_by that would accomplish
this.

I know that I can do this:

@jobs.sort! {|a,b| a.location_name <=> b.location_name}

(where location_name is an instance method that retrieves from the
job.location either its name or its address).

But that's slower, I think, and anyway doesn't seem to be quite cricket.

Any suggestions?

Try sorting by both. Perhaps the NULL's will show up on top, and the
only "real" sorting will be done on the address value for those
records.

Bart

Hi, all. I've got a list of jobs I'm trying to sort based on the
'location' column. The location column is actually filled in by a
method in the location model, and it's "name" if the locations.name
column is not null, otherwise it's locations.address.

So, the long and short is that I'd like to figure out how to do this
in my job_controller.rb:

sort_jobs_by = 'locations.name if locations.name is not null,
otherwise use locations.address'

@jobs = Job.find(:all, :order => sort_jobs_by, :include => [:location])

Of course, "locations.name if locations.name is not null, otherwise
use locations.address" is not exactly valid SQL, and so that won't
work. I need to know what to set sort_jobs_by that would accomplish
this.

I know that I can do this:

@jobs.sort! {|a,b| a.location_name <=> b.location_name}

(where location_name is an instance method that retrieves from the
job.location either its name or its address).

But that's slower, I think, and anyway doesn't seem to be quite cricket.

Any suggestions?

If mysql... :order => "IFNULL(locations.name, locations.address)"

If postgresql, :order => "COALESCE(locations.name, locations.address)"

-philip

Sorry for the delay, thanks for the info! That was just what I was
after. Sadly, I then found out that not all of the fields are NULL;
some are just empty strings. But I'm down the road a ways with it,
and now I've learned about the IFNULL(), so mucho thanks!