参数是“数据资源管理器”(Data Explorer) 查询中可以使用的强大工具。参数允许查询更具动态性和可定制性,并且您无需在查询中硬编码值,而是可以声明变量,这些变量在运行查询时会提示输入。
声明参数
要声明参数,您可以使用以下语法:
-- [params]
-- int :parameter_name = 10
查询的参数部分将始终以 -- [params] 开头,每个参数类型占一行,其中 parameter_name 将替换为您参数的名称。
这将创建一个字段,您可以在每次运行查询时输入不同的值。
参数类型
在“数据资源管理器”(Data Explorer) 查询中声明参数时,您可以指定不同类型的输入。以下是可用的参数类型及其描述:
数值参数
int: 显示一个数字输入框,成为一个数值。int限制为 32 位数字。bigint: 与int类似,但可以更大。double: 允许小数。
数值参数的正确性将在前端进行验证。
字符串参数
string: 自由文本框,成为一个文本值。
列表参数
int_list: 输入逗号分隔的整数,在查询中成为逗号分隔的整数。string_list: 与int_list类似,但用于字符串。
特定 ID 参数
post_id: 数字输入;确保指定的帖子存在于论坛上,然后才运行查询。topic_id: 与post_id类似,但用于主题。badge_id: 确保指定的徽章存在。
布尔参数
boolean: 显示一个复选框。null boolean: 显示一个下拉菜单,允许空输入。
时间参数
time: 显示一个时间选择器输入框。date: 显示一个日期选择器输入框。datetime: 显示一个包含日期和时间的输入框。
选择器参数
user_id: 显示 Discourse 用户选择器框,并成为数字用户 ID。user_list: 与user_id类似,但允许多个用户,成为数字用户 ID 的逗号分隔列表。group_id: 与user_id类似,但用于组。group_list: 与user_list类似,但用于组。category_id: 与user_id类似,但用于分类。
内部参数
current_user_id: 没有输入界面;自动将变量设置为运行查询的用户的用户 ID
使用列表参数
在使用列表参数(int_list、string_list、user_list)时,必须特别小心以避免语法错误。以下是正确使用列表参数的示例:
-- [params]
-- user_list :the_user_ids
SELECT SUM(length(bio_raw))
FROM user_profiles
WHERE user_id IN (:the_user_ids)
Null 参数
您还可以通过在参数类型前加上 null 来允许空输入。这意味着在运行查询时,不必为该参数提供值。
以下是一些声明此类参数的示例:
-- [params]
-- null int :null_int
-- null boolean :null_boolean
-- null string :null_string
-- null current_user_id :me
在上述 SQL 中,null_int、null_boolean 和 null_string 是在运行查询时可以留空的参数。
让我们看看如何在查询中使用这些类型的参数:
-- [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)
在此查询中,如果未提供 post_id 或 username(即留空为 null),查询将忽略 WHERE 子句的该部分。这允许更灵活的查询,其中某些条件是可选的。
前端验证
大多数类型的参数将在前端进行验证。这些验证包括必需但未填写的输入、无效的数字输入、不存在的分类或组、格式错误的日期时间等。对于无效输入,错误原因将显示在表单中,并且运行查询的操作将被拒绝。
附加示例
以下是声明不同类型参数的一些附加示例:
-- [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
-- current_user_id :me


