Dominique Devienne 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 u1.user, u2.user from os_users u1, os_users u2 where upper(u1.user) =
> upper(u2.user) and u1.user <> u2.user;
> 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);
>
> I tried both queries above, but they are slow (almost 3s, with close
> to 4M steps, i.e. O(N^2))
You can get O(N * log N) with a proper index, and avoiding the function:
CREATE INDEX u_nocase ON os_users(user COLLATE NOCASE);
SELECT u1.user, u2.user
FROM os_users u1
JOIN os_users u2 ON u1.user COLLATE NOCASE = u2.user COLLATE NOCASE
AND u1.user <> u2.user;
(Same with the other query.)
With a recent enough SQLite, you can use an expression index without
changing the queries:
CREATE INDEX u_upper ON os_users(upper(user));
Regards,
Clemens