Drupal 8 и PostgreSQL: Как я могу использовать результат выражения внутри предложения WHERE? - PullRequest
0 голосов
/ 16 марта 2020

Привет!

Я создаю запрос к базе данных, используя интерфейс запросов Drupal. При этом я также успешно добавляю выражение, которое генерирует условное значение. Содержимое этого условного поля представляет собой строку даты в формате ISO.

Теперь я хотел бы использовать это вычисляемое поле в моем предложении WHERE. В другом проекте, использующем MySQL, я смог просто использовать имя, содержащее результат выражения внутри предложения where, но, похоже, это не работает в PostgreSQL. Я всегда получаю ошибку «столбец не существует», если я добавляю префикс имени выражения к псевдониму таблицы базы данных или нет.

(необработанный и сокращенный) запрос выглядит следующим образом (все еще содержит значение заполнители):

SELECT
  base.nid AS nid,
  base.type AS type,
  date.field_date_value AS start,
  date.field_date_end_value AS "end",
  CASE WHEN COALESCE(LENGTH(date.field_date_end_value), 0) > 0 THEN date.field_date_end_value ELSE date.field_date_value END AS datefilter
FROM {node} base
LEFT JOIN {node__field_date} date ON base.type = date.bundle AND base.nid = date.entity_id AND base.vid = date.revision_id AND attr.langcode = date.langcode AND date.deleted = 0
WHERE (base.type = :db_condition_placeholder_0) AND (datefilter > :db_condition_placeholder_2)
ORDER BY field_date_value ASC NULLS FIRST

Как уже говорилось, не имеет значения, применяю ли я фильтр с использованием "date.datefilter" или просто "datefilter". Поле / выражение получается просто отлично в списке результатов, если я не пытаюсь использовать его в части WHERE. Итак, как я могу использовать результат выражения для фильтрации результатов запроса?

Любая подсказка приветствуется! Заранее спасибо!

1 Ответ

0 голосов
/ 16 марта 2020

Можно попытаться создать производную таблицу, которая определяет новый столбец «datefilter».

Например, вместо кодирования:

select case when c1 > 0 then c1 else -c1 end as c, c2, c3 
from t 
where c = 0;
ERROR:  column "c" does not exist
LINE 1: ...c1 > 0 then c1 else -c1 end as c, c2, c3 from t where c = 0;

Определить производную таблицу, которая определяет новый столбец и использовал его во внешнем SELECT:

select c, c2, c3 
from 
 (select case when c1 > 0 then c1 else -c1 end as c, c2, c3 from t) as t2 
where c=0;
...