Ответы пользователя по тегу PostgreSQL
  • Изучаю базы данных. В уроках используется MySQL. Можно ли заменить его на PostgreSQL без потери совместимости?

    @ponaehal
    Для того что бы понять/почувствовать язык SQL - вполне достаточно MySQL.
    Как только изучите 4 основные команды DML и парочку команд DDL, можно задуматься о различиях и о конкретной платформе. Сугубо ИМХО.
    Ответ написан
    Комментировать
  • Как добавить столбец на основе динамического столбца?

    @ponaehal
    ИМХО (не проверял):
    CASE... END * 10 as date_value, date_value + tags_count as test
    Вы обзываете столбец и пытаетесь этот алиас тут же использовать. Видимо именно это не нравится интерпретатору.

    Сработает так:

    1. SELECT date_value, date _value*tags_count FROM (SELECT CASE... END as date_value , tags_count FROM "articles" ....)

    или так:
    2. SELECT
    CASE ... END as date value,
    CASE .... END *tags_count as date_value2
    FROM "articles" ....
    Ответ написан
    Комментировать
  • Как получить список чисел отсутвующих в базе PostgreSQL?

    @ponaehal
    ИМХО, если такой вопрос возник, то ВОЗМОЖНО что -то делаете не так. Вещать бизнес-смысл на IDб основная цель которых обеспечить уникальность - это в общем случае не очень правильно.
    Тем не менее...
    Возможно есть более красивое решение, но сходу не приходит в голову (для каждой БД оно будет свое).
    Общий подход:
    1. Создаем таблицу t2 с большим количеством строк и с одним полем num. В цикле заполняем ее значениями от 1 до n.
    2. В запросе минусуем исходную таблицу из t2
    SELECT t.num FROM t2
    EXCEPT
    SELECT t.id FROM base_table t
    все.

    ЗЫ Если таблицу делать лень, а число записей небольшое, то можно воспользоваться
    SELECT unnest(array[1, 2, 3, 4)
    Ответ написан
    1 комментарий
  • Tsrange вывод временных интервалов?

    @ponaehal
    В принципе можно решить и "в лоб" но лень...

    В порядке бреда:
    Заполнить таблицу временными минимальными доступными временными интервалами в промежутке с 9 до 18 (создать расписание).
    В вашем случае это будет 18 тридцатиминутных интервалов (всего 18 строк).
    Далее, например, в случае резервирования на час, резервировал бы сразу 2 интервала.

    А потом все сводится к банальному UNION ALL
    SELECT <выводим интервал времени если при переводе часов в минуты остаток от деления на 30 равен 0>
    UNION ALL
    SELECT <выводим интервал времени если при переводе часов в минуты остаток от деления на 45 равен 0>
    UNION ALL
    SELECT <выводим интервал времени если при переводе часов в минуты остаток от деления на 60 равен 0>
    UNION ALL
    SELECT <выводим интервал времени если при переводе часов в минуты остаток от деления на 90 равен 0>
    Ответ написан
    1 комментарий
  • Как раз и навсегда отсортировать записи в PostgreSQL?

    @ponaehal
    Говорю про Oracle, но подозреваю во всех БД примерно так же
    Раз и навсегда отсортировать данные не получится. Данные в таблице неотсортированы. Можно это сделать искусственно. Перенести данные в другую таблицу, потом данные в исходной таблице удалить и залить из второй в нужном порядке. Но смысла от этого немного - когда кто-нибудь еще добавит данные в эту таблицу, ваша сортировка поедет. В общем случае, гораздо правильнее воспользоваться индексом (в нем данные осортированы) и следить что бы он использовался в запросах.
    Ответ написан
    Комментировать
  • Как проверить несколько условий в having при использовании array_agg?

    @ponaehal
    Насколько я помню молодость HAVING фильтрует по значениям агрегаторов (SUM, MAX и т.д.), а в вашем случае нужно просто добавить фильтр в условие WHERE .... AND group in (1,2)
    Ответ написан
    Комментировать