This is fairly trivial, but it took a few minutes to work out, so I figured I'd post it. Someone on my team needed to perform a case-sensitive GROUP BY operation on a table with a case-insensitive collation. I had performed case-sensitive SELECTs before by "casting" the field in question to an alternate collation, so I tried that, but couldn't get it to work at first. Of course, had I thought about it, I would have realized that the same operation needs to be applied in both the GROUP BY and the SELECT.
Ex:
create table foo
(bar varchar(20))
insert into foo select 'Banana'
insert into foo select 'banana'
insert into foo select 'Banana'
select * from foo
select
bar COLLATE SQL_Latin1_General_CP1_CS_AS
, count(*)
from foo
group by bar COLLATE SQL_Latin1_General_CP1_CS_AS
Alternately, one could use Microsoft's recommended method and convert the field to binary and then back. I haven't performance-tested the two methods, so I'm not sure which is faster. I leave that as an exercise for the reader. ;)
select convert(varchar(20),x.bar), x.ct
from
(select
convert(binary(20), bar) as bar
, count(*) as ct
from foo
group by convert(binary(20),bar)
) as x
Wednesday, March 12, 2008
Subscribe to:
Post Comments (Atom)
1 comment:
Thanks, this save me some time.
I had to read it carefully though.
Here's my simple example:
select upper(name)
from foo
group by upper(name)
having count(*) > 1;
Post a Comment