mysql 如何在knex中使用连接条件为“on”的“and”

k2fxgqgv  于 2023-02-18  发布在  Mysql
关注(0)|答案(4)|浏览(209)

我正在尝试生成如下查询:

select ifnull(t1.name, ‘default’) as name
from tab1 as t1
left join tab2 as t2 
 on t1.id=t2.id and t2.code=“someValue”

我在诺克斯写的:

var query = knex().from(’tab1’).join(’tab2', function() {

    this.on('tab1.id', '=', 'tab2.id').andOn('tab2.code', '=', 'someValue')
}, 

‘left')
.column([

knex.raw(‘IFNULL(tab1.name, "no name") as name')

]);

这不会执行,因为它将“someValue”视为列。在这种情况下如何应用“and”条件?

e5njpo68

e5njpo681#

  • 以上所有答案都很好,但如果您希望使用单行而不使用回调,则此语法适合您。*并且您需要表示不带引号的自定义值
knex('tab1').join('tab2',{'tab1.id':'tab2.id','tab2.code':someValue})
sz81bmfz

sz81bmfz2#

var query = knex().from('tab1').join('tab2', function() {
   this.on('tab1.id', '=', 'tab2.id')
   .on('tab2.code', '=', knex.raw('?', ['someValue']))
}, 'left')
.column([knex.raw('IFNULL(tab1.name, "no name") as name')]);

使用knex.raw将someValue作为字符串引用就可以了,希望这对大家有所帮助。

1rhkuytd

1rhkuytd3#

没有很好的文档,但是现在可以使用onVal及其任何和/或变体。
所以与其说

.on('tab2.code', '=', knex.raw('?', ['someValue']))

你可以简单地写:

const query = knex()
  .from('tab1')
  .join('tab2', function() {
     this.on('tab1.id', '=', 'tab2.id')
     this.andOnVal('tab2.code', '=', 'someValue')
}, 'left')
.column([knex.raw('IFNULL(tab1.name, "no name") as name')]);
e1xvtsh3

e1xvtsh34#

我不得不使用knex.raw('?', ['someValue'])而不是knex.raw('someValue')
对于我(使用Knex 0.13.0),可接受的解决方案.on('tab2.code', '=', knex.raw('someValue')生成查询:tab2.code = someValue不带引号),然后导致Unknown column someValue错误。
使用.on('tab2.code', '=', knex.raw('?', ['someValue']))tab2.code与字符串文字而不是列进行比较,生成预期的tab2.code = 'someValue'带引号)。

相关问题