【问题标题】:How do you get conditional filters within query files?如何在查询文件中获取条件过滤器?
【发布时间】:2022-10-19 16:39:57
【问题描述】:

我以前使用条件模板字符串插值,它看起来像这样:

const queryArgs = {
  type,
  status,
}
const query = `
  SELECT
    id,
    type,
    status,
    content
  FROM
    some_table
  WHERE
    ${type ? "type = $(type)" : ""}
    ${status ? "AND status = $(status)" : ""}
  ORDER BY
    id
`

它完成了工作,并且没有违反pg-promise 关于模板字符串插值的规则,因为它不是对输入值进行插值,而是对它们的 args 引用进行插值。
有没有办法为查询文件获取类似的逻辑?许多像这样的过滤器往往是复合的,因此编写过滤器组的每一个组合不是一种选择,特别是因为这些查询将用作 CTE 链的一部分。

【问题讨论】:

标签: postgresql pg-promise postgresql-13


【解决方案1】:

可以用纯 SQL 来完成:

SELECT
  id,
  type,
  status,
  content
FROM
  some_table
WHERE
  (${type} IS NULL OR type = ${type})
  AND
  (${status} IS NULL OR status = ${status})
ORDER BY
  id

ORAND 逻辑类似于 javascript ||&& 运算符。所以上面的表达式的意思是“如果类型不为空,则按类型过滤,如果状态不为空,则按状态过滤”。因此,如果两个值都是NULL,则条件评估为TRUE,因此所有行都包含在结果中。
一开始可能看起来有点冗长,但这种方法的好处是这些条件可以写在存储过程中,过滤器值作为参数传递。因此,单个操作不需要多个查询文件。

【讨论】:

    猜你喜欢
    • 2022-08-24
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2014-06-04
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多