суббота, 27 ноября 2010 г.

sqlite: приятные мелочи в области агрегирующих функций

Продолжаю очень приятно удивляться sqlite. Очередным поводом стали агрегирующие функции:

  • есть две функции для вычисления сумм: традиционная sum() и чуть менее традиционная total() – обе суммируют не-NULL значения, но первая (в соответствии со стандартом SQL) возвращает пустой набор данных в случае, если таких значений не было, а вот вторая всегда возвращает 0.0 (что в некоторых случаях может быть весьма удобно). Кроме того, функция total() всегда возвращает double и не подвержена арифметическому переполнению;
  • есть крайне полезная функция group_concat(field[, separator]), которая объединяет значения поля в одну строку. Разделитель по-умолчанию – запятая. Причем в варианте с разделителем по-умолчанию можно использовать еще и DISTINCT:
    SELECT group_concat(DISTINCT user_name) FROM …. GROUP BY …
    Замечу, что в SQL Server-е (горячо и искренне мною любимом) нет простого способа сделать тоже самое – только через custom aggregate (т.е. специальную сборку, которую писать/разворачивать).

В общем: чем больше смотрю - тем больше нравится.

HTH, AlexS

2 комментария:

  1. SQL Server куча хаков, можно например через FOR XML PATH, там в одну строку. Хотя конешно єто сложно сравнить с одним вызовом.

    ОтветитьУдалить
  2. Да, я об этом знаю (даром что забыл упомянуть). Но получить в результате XML (который надо парсить) - это немного не то, да и от разделителя после последнего элемента придется избавляться отдельно.

    ОтветитьУдалить