Каноническим способом в стандартном SQL является:
select a, b
from t
where a < b
union all
select a, b
from t
where a > b and not exists (select 1 from t t2 where t2.a = t.b and t2.b = t.a);
Обратите внимание, что это предполагает отсутствие дубликатов или одинаковых значений. Вы можете легко справиться с ними, используя сравнения select distinct
и <=
. По моему опыту, эта проблема часто возникает, когда на пару не более двух строк.
Это сохраняет исходные значения. Итак, если вы начнете с:
1 2
5 4
Вы получите это в наборе результатов.
Если вас не интересует порядок, многие базы данных поддерживают least()
/ greatest()
:
select least(a, b) as a, greatest(a, b) as b
from t
group by least(a, b), greatest(a, b);
Вы можете сделать то же самое с case
выражениями. Или проще:
select distinct least(a, b) as a, greatest(a, b) as b
from t;