Utilizing Parameters in Data Explorer Queries

Parameters are a powerful tool that can be used in Data Explorer queries on Discourse. Parameters allow for more dynamic and customizable queries, and instead of hard-coding values in your queries, you can declare variables that will prompt for input when the query is run.

Declaring a Parameter

To declare a parameter, you can use the following syntax:

-- [params]
-- int :parameter_name = 10

The parameter’s section of the query will always start with -- [params], followed by each type of parameter on a new line, where parameter_name would be replaced by the name for your parameter.

This will create a field where you can input different values each time you run the query.

Types of Parameters

When declaring parameters in your Data Explorer queries, you can specify different types of inputs. Here are the available parameter types and their descriptions:

Numeric Parameters

  • int: Shows a number input, becomes a numeric value. int is restricted to 32-bit numbers.
  • bigint: Similar to int, but can be larger.
  • double: Allows decimal values.

The correctness of the numeric parameters will be verified on the front end.

String Parameters

  • string: Freeform textbox, becomes a text value.

List Parameters

  • int_list: Enter comma-separated integers, becomes comma-separated integers in the query.
  • string_list: Similar to int_list, but for strings.

Specific ID Parameters

  • post_id: Numeric input; ensures the specified post exists on the forum before running the query.
  • topic_id: Similar to post_id, but for topics.
  • badge_id: Ensures the specified badge exists.

Boolean Parameters

  • boolean: Shows a checkbox.
  • null boolean: Shows a dropdown, allowing for an empty input.

Time Parameters

  • time: Displays a time picker input.
  • date: Displays a date picker input.
  • datetime: Displays a input box includes both date and time.

Selector Parameters

  • user_id: Shows the Discourse user selector box, and becomes the numeric user ID.
  • user_list: Similar to user_id, but allows for multiple users, becoming a comma-separated list of the numeric user IDs.
  • group_id: Similar to user_id, but for groups.
  • group_list: Similar to user_list, but for groups.
  • category_id: Similar to user_id, but for categories.

Using List Parameters

When using list parameters (int_list, string_list, user_list), special care must be taken to avoid syntax errors. Here is an example of correctly using a list parameter:

-- [params]
-- user_list :the_user_ids
SELECT SUM(length(bio_raw))
FROM user_profiles
WHERE user_id IN (:the_user_ids)

Null Parameters

You can also allow for an empty input by prefixing the parameter type with null. This means that it’s not necessary to provide a value for that parameter when running the query.

Here’s some examples of how you would declare such parameters:

-- [params]
-- null int :null_int
-- null boolean :null_boolean
-- null string :null_string

In the above SQL, null_int, null_boolean, and null_string are parameters that can be left empty when running the query.

Let’s see how these types of parameters can be used in a query:

-- [params]
-- null int :post_id
-- null string :username
SELECT *
FROM users
WHERE (id = :post_id OR :post_id IS NULL)
AND (username = :username OR :username IS NULL)

In this query, if post_id or username is not provided (i.e., left as null), the query will ignore that part of the WHERE clause. This allows for more flexible queries where some conditions are optional.

Front-end Validation

Most types of parameters will be validated on the front end. These validations include required but unfilled inputs, invalid numeric input, non-existent categories or groups, malformed times, etc. For invalid input, the reason for the error will be displayed in the form, and the run query operation will be rejected.

Additional Examples

Here are some additional examples of declaring different types of parameters:

-- [params]
-- int          :int = 3
-- bigint       :bigint = 12345678912345
-- boolean      :boolean
-- null boolean :boolean_three = #null
-- string       :string = little bunny foo foo
-- date         :date = 14 jul 2015
-- time         :time = 5:02 pm
-- datetime     :datetime = 14 jul 2015 5:02 pm
-- double       :double = 3.1415
-- string       :inet = 127.0.0.1/8
-- user_id      :user_id = system
-- post_id      :post_id = http://localhost:3000/t/adsfdsfajadsdafdsds-sf-awerjkldfdwe/21/1?u=system
-- topic_id     :topic_id = /t/-/21
-- int_list     :int_list = 1,2,3
-- string_list  :string_list = a,b,c
-- category_id  :category_id = meta
-- group_id     :group_id = admins
-- user_list    :mul_users = system,discobot

More Topics in this Series

11 Likes

These are great guides, thank you for posting them @SaraDev :slight_smile: :hugs:

6 Likes

@AlexDev
can a field name in where clause be a parameter ? thanks
or the whole sql statement be a parameter to pass in from the rest endpoint /admin/plugin/explorer/queries/id/run

PSA: You can not use numbers in your parameter names, e.g. “foo123” will fail.

-- [params]
-- string       :foo123 = a

SELECT :foo123

results in

PG::SyntaxError: ERROR:  syntax error at or near ":"
LINE 10: SELECT :foo123
                ^
2 Likes