如何在 knex.js 中的 .select() 内有条件地附加列

How to append columns conditionally inside .select() in knex.js

我想要实现的是在满足条件时在 .select() 内添加列名。 所以我的代码如下:

const type = req.query.type;

knex('some_table').select('id','name',knex.raw('case '+ type +'when 1 then some_table.type else null end'))

此代码的问题在于它 return 在 type != 1 时为空,但我希望它 return 什么都没有。

所以基本上,它应该添加 'type' 列,如果 type = 1 如果没有,则什么都不添加。

有什么想法吗?

因此,我怀疑您实际上并不是在 CASE 声明之后。这些用于检查列 和操作结果集。例如:

knex('some_table')
  .select(
    'id',
    'name',
    knex.raw(`CASE WHEN ${type} = 'Apricots' THEN 'Apricots!' ELSE 'Not an apricot!' END`)
)

或者使用更简单的形式,

`CASE ${type} WHEN 'Apricots' THEN 'Hey, it's an apricot.' END`

你似乎在追求什么,虽然还不完全清楚,但有条件地选择一个基于查询字符串的列。这可以在发出查询之前实现:

const columns = [
  'id',
  'name'
]

if (req.query.type) {
  columns.push(req.query.type)
}

knex('some_table').select(columns)

我希望应该清楚,允许用户指定返回结果集中的哪些列容易被滥用,因此您应该非常小心可以指定哪种数据。

如果这不是您想要的,您可能需要稍微澄清一下您的问题。

如何动态构建列名数组,无论您如何添加它们(例如 array.push),然后将它们作为参数传播到 select 调用中?

const myColumns = ['column1']

if (conditionIsTrue){
 myColumns.push('column2')
}

knex('some_table')
  .select(...myColumns) // <--- the ... here turns the array into individual args