如何在 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
我想要实现的是在满足条件时在 .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