Перейти к содержанию

Необязательные переменные

Вы можете сделать часть запроса необязательной. Например, можно создать опциональное выражение WHERE, которое содержит SQL‑переменную, так что если переменной не передали значение (через фильтр или через URL), запрос всё равно выполнится — как будто WHERE отсутствует.

Чтобы сделать переменную опциональной в прямом запросе, "оберните" в [[ .. ]] весь фрагмент, который содержит {{variable}}. Если пользователь введёт значение в виджете фильтра для variable, Glarus BI подставит этот фрагмент кода в шаблон. Еслм не введёт — Glarus BI проигнорирует его и выполнит запрос так, будто этого фрагмента кода не было.

В примере ниже если для cat не задано значение, запрос просто выберет все строки из таблицы products. Но если у cat есть значение, например "Widget", запрос выберет только товары с категорией Widget:

SELECT
  count(*)
FROM
  products
[[WHERE category = {{cat}}]]

SQL должен корректно выполняться без опционального фрагмента

Убедитесь, что ваш SQL остаётся валидным, когда переменной в опциональном фрагменте в [[ ]] не передали значение.

Например, если вынести слово WHERE из фрагмента в [[ ]], вы получите ошибку, когда для cat не задано значение:

-- this will cause an error:

SELECT
  count(*)
FROM
  products
WHERE
  [[category = {{cat}}]]

Это происходит потому, что когда для cat не задано значение, Glarus BI попытается выполнить SQL так, будто фрагмента в [[ ]] не существовало:

SELECT
  count(*)
FROM
  products
WHERE

Это невалидный SQL. Вместо этого поместите весь WHERE в [[ ]]:

SELECT
  count(*)
FROM
  products
[[WHERE
  category = {{cat}}]]

Когда для cat нет значения, Glarus BI всё равно выполнит валидный запрос:

SELECT
  count(*)
FROM
  products

При нескольких опциональных фрагментах нужен хотя бы один WHERE

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

SELECT
  count(*)
FROM
  products
WHERE
  TRUE
  [[AND id = {{id}}]]
  [[AND {{category}}]]

Последний фрагмент использует фильтр поля (обратите внимание: в AND нет указания столбца). При использовании фильтра поля столбец в запросе указывать нельзя — переменную нужно сопоставить полю в боковой панели.

Опциональные переменные в MongoDB

Если вы используете MongoDB, вы можете сделать часть запроса опциональной так:

[
    [[{
        $match: {category: {{cat}}}
    },]]
    {
        $count: "Total"
    }
]

Или с несколькими опциональными фильтрами:

[
    [[{ $match: {{cat}} },]]
    [[{ $match: { price: { "$gt": {{minprice}} } } },]]
    {
        $count: "Total"
    }
]

Задание сложных значений по умолчанию прямо в запросе

Вы можете задавать значения по умолчанию прямо в запросе, если поместить синтаксис комментария внутрь закрывающих скобок опционального параметра.

WHERE column = [[ {{ your_parameter }} --]] значение_по_умолчанию

Комментарий будет «активироваться» каждый раз, когда вы передаёте значение в your_parameter.

Это полезно, когда значение по умолчанию сложное (например, если это функция вроде CURRENT_DATE). Ниже пример PostgreSQL, который задаёт значение по умолчанию для фильтра даты как текущую дату с помощью CURRENT_DATE:

SELECT
  *
FROM
  orders
WHERE
  DATE(created_at) = [[ {{dateOfCreation}} --]] CURRENT_DATE

Если вы передадите значение переменной, выполнится WHERE, включая синтаксис комментария, который «закомментирует» функцию CURRENT_DATE по умолчанию.

Обратите внимание: маркер комментария (--) может отличаться в зависимости от вашей базы данных — используйте синтаксис комментариев, который поддерживает ваша СУБД.