PostgreSQL использует псевдоним при условии Where

#sql #postgresql #conditional-statements

#sql #postgresql #условные операторы

Вопрос:

Как установить условие в поле last_order, где последний порядок — это настраиваемое поле, созданное функцией max sql и группируемое по идентификатору пользователя :

 SELECT "users"."id", "users"."name", "users"."email", "users"."type", "users"."created_at", MAX(TO_CHAR(order_details.created_at, 'YYYY-MM-dd HH24:MM')) AS last_order
FROM "users"
LEFT JOIN "order_details" on "order_details"."user_id" = "users"."id"
WHERE EXISTS (
    SELECT *
    FROM "roles"
    LEFT JOIN "role_users" on "roles"."id" = "role_users"."role_id"
    WHERE "role_users"."user_id" = "users"."id" and "slug" = 'member'
) AND "users"."status" in (0)
AND (LOWER(CAST("users"."id" as TEXT)) LIKE '%%'
OR LOWER(CAST("email" as TEXT)) LIKE '%%'
OR LOWER(CAST("last_order" as TEXT)) LIKE '%%'
OR LOWER(CAST("name" as TEXT)) LIKE '%%')
GROUP BY "users"."id"
ORDER BY "created_at" desc
  

Я всегда получаю эту ошибку:

 column "last_order" does not exist
  

Как использовать last_order?? я уже проверяю его по правильному псевдониму.

Этот запрос, сгенерированный таблицами данных, причиной ошибки является то, что я использовал псевдоним для функции поиска datatables, мой код datatables, как показано ниже:

 columns: [
    { data: 'id', name: 'users.id', class: 'text-center', orderable: false },
    { data: 'email', name: 'email' },
    { data: 'last_order', name: 'last_order', class: 'text-center', orderable: true },
    { data: 'name', name: 'name' },
]
  

Комментарии:

1. Потому что вы не можете использовать псевдоним в where предложении. Кстати, вы не группируете по большому количеству столбцов, которые вы тоже не агрегируете

2. @juergend Итак, как включить максимальное поле функции в предложение where?

3. Используйте having предложение

Ответ №1:

Две проблемы:

  • Вы не можете использовать псевдонимы столбцов select , определенные в where предложении in.
  • Вы не можете использовать функции агрегирования в where предложении.

Переместите условие в having предложение:

 . . .
GROUP BY "users"."id"
HAVING LOWER(CAST(last_order as TEXT)) LIKE '%%'
ORDER BY "created_at" desc
  

Я предполагаю, что ваши like шаблоны на самом деле более интересны, чем '%%' . И вы не должны использовать like для столбцов даты / времени. Просто используйте соответствующие сравнения равенства / диапазона или сравнения для частей даты.

Комментарии:

1. И postgres, вероятно, выдает ошибку, если выбранные столбцы не входят в предложение group by

2. @juergend . . . Postgres функционально поддерживает (необязательно) стандарт ANSI, который позволяет использовать функционально зависимые столбцы в GROUP BY , так что это не проблема, если предположить, что users.id это уникально.

3. @GordonLinoff Да, это верно, но моя проблема в том, что этот запрос генерируется таблицами данных, когда я использую таблицу поиска, запрос просто такой, поэтому я не могу изменить оператор запроса, единственное, что мне нужно, это то, как я использую псевдоним при условии where или изменяю столбец datatablesимя.

4. @GordonLinoff и я пытаемся использовать having, результат тот же «столбец «last_order» не существует»