使用knexjs,如何比较.where()函数中的两列?

dav*_*rth 11 javascript knex.js

仅使用knexjs(没有书架)我想做类似以下查询的事情:

select * from table1 where column1 < column2
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时:

.table("table1").select().where("column1", "<", "column2")
Run Code Online (Sandbox Code Playgroud)

knexjs生成的SQL是:

select * from table1 where column1 < 'column2'
Run Code Online (Sandbox Code Playgroud)

这没有给出理想的结果b/c它没有比较列的值,而是比较字符串'column2'的值.

谁知道怎么做我想要的?谢谢!

dav*_*rth 16

好了,一些挖后,它看起来像它可以做到这种方式.不确定这是否是最佳做法,但此刻,它一直有效,直到我听到其他情况......

.table("table1").select().where("column1", "<", knex.raw("table1.column2"))
Run Code Online (Sandbox Code Playgroud)

再次,不理想,但它完成了工作.一定要确定

import knex from "knex";
Run Code Online (Sandbox Code Playgroud)

在你正在使用它的任何文件的顶部.

  • .whereRaw("?? = ??",["column1","column2"])也有效 (7认同)
  • “ ??”代表标识符的绑定,例如列名或表名。“?”表示值的绑定,例如数字或字符串。 (2认同)

fuz*_*Tew 5

从knex 0.15.0(2018年7月)开始,我们现在有:

table("table1").select().where("column1", "<", knex.ref("column2"))
Run Code Online (Sandbox Code Playgroud)

参见https://knexjs.org/#Ref

正如Greg Hornby在对其他答案的评论中提到的那样,您还可以??在原始查询中使用以绑定到列或表名。