On Fri, May 13, 2016 at 10:14 AM, Dominique Devienne <ddevienne at gmail.com>
wrote:

> Imagine I have a single table containing a single text column, of user
> names.
> I'm trying to find user names which differ only by case.
>
> > select count(*) from os_users
> 1969
>
> > select u1.user, u2.user from os_users u1, os_users u2 where
> upper(u1.user) = upper(u2.user) and u1.user <> u2.user
> foo|FOO
> FOO|foo
>
> > select user from os_users u where exists (select 1 from os_users u2
> where upper(u2.user) = upper(u.user) and u2.user <> u.user)
> foo|FOO
> FOO|foo
>
> I tried both queries above, but they are slow (almost 3s, with close
> to 4M steps, i.e. O(N^2)), and ideally I'd like a query returning only
> one row. And that's w/ or w/o a PK or UNIQUE INDEX on the one column.
>
> > select group_concat(user) from os_users group by upper(user) having
> count(*) > 1
> foo,FOO
>
> I did manage the above, which returns in 7ms, and get me what I want,
> but in aggregated form (thus needs reparsing). Is there a query that
> can return just foo|FOO, i.e. the pairs of mixed-case matches
> efficiently?
>

?how about: SELECT group_concat(user,"|") FROM os_users GROUP BY
upper(user) HAVING count(*) > 1
??



>
> Thanks, --DD
>


-- 
The unfacts, did we have them, are too imprecisely few to warrant our
certitude.

Maranatha! <><
John McKown

Reply via email to