Как написать оператор выбора с условием нечувствительности к регистру из вывода запроса select

Я получаю такие данные

  • Доха
  • доха
  • Дубай
  • Абу Даби
  • Абу Даби

из запроса select distinct(trim(name)) as loc from locations order by trim(name)

Теперь я хочу удалить дубликаты с помощью lower() или upper() и выбрать первую запись. Если я использую нижнюю функцию, как показано ниже,

select distinct(lower(A.loc)) from( select distinct(trim(name)) as loc from locations order by trim(name) ) as A order by lower(A.loc);

это дает результат, преобразованный в более низкий, как показано ниже.

  • доха
  • дубаи
  • Абу Даби

    Но я хочу оригинальный результат, как уже упоминалось ранее.

  • Доха
  • Дубай
  • Абу Даби

1 ответ

Решение

демо: дб <> скрипка

SELECT DISTINCT ON (lower(city))
    city
FROM
    cities

DISTINCT ON берет произвольный столбец и выдает первый из дубликатов. В этом случае столбец создается внутри со всеми строчными буквами. Затем берется первая запись, но только исходный столбец.


ПРИМЕЧАНИЕ. У вас нет особого заказа. Будет принят случайный порядок (например, как данные хранятся внутри). Чтобы получить значение в верхнем регистре, вы должны написать:

SELECT DISTINCT ON (lower(city))
    city
FROM
    cities
ORDER BY lower(city), city DESC

демо: дб <> скрипка

ORDER BY lower(city) необходимо, потому что DISTINCT ON нужны данные столбцы, чтобы быть первым заказанным. После этого вы можете заказать любой другой столбец. ORDER BY column DESC перемещает верхний регистр сверху.

Другие вопросы по тегам