【问题标题】:Converting a PostgresSQL query into Knex.js将 PostgresQL 查询转换为 Knex.js
【发布时间】:2021-02-03 23:52:02
【问题描述】:

我必须使用 knex 在whereIn 中使用LOWER 函数。 我想更改下面的代码行

whereIn("name", members);

如果我执行whereIn('LOWER("name")', members);,则会出现错误 Column LOWER("name") is not present. 我尝试使用 knex.raw 但又没有得到正确的语法。

const roleMembers = await t("roles")
          .select({ role_id: "id" }, "name")
          .whereIn(t.raw("LOWER('name')"), members);

错误:

index.d.ts(1184, 5)

当我尝试添加 await 时,语法错误消失,但是当我执行此代码时,我得到以下错误

错误:LOWER(name) - syntax error at or near "LOWER" 我指的是http://knexjs.org/#Builder-whereIn

我们有whereRawwhereIn 有类似的东西吗?需要一些帮助来解决此问题。

注意:我用的都是LOWER、lower、Lower。

【问题讨论】:

  • 如果你这样做whereIn("lower(name)", members);怎么办?

标签: javascript sql node.js postgresql knex.js


【解决方案1】:

knex.raw()可用于列组件

knex('members').whereIn(knex.raw('Lower("name")'), members)
select * from `members` where Lower("name") in ('Tom', 'Dick', 'harry')

【讨论】:

  • 马特,我试过你的代码,但仍然出错。我已经更新了我的问题。
  • 不确定.. 也适用于我的扩展查询。
  • @HimanshuShekhar 你做错了t.raw。引号的类型很重要。 knex.raw('Lower("name")')knex.raw("Lower('name')") 不一样
  • 谢谢,Mikael 我没有注意到“引用”。这真的很重要。
【解决方案2】:

最终解决方案如下。

const roleMembers = await t("roles")
          .select({ role_id: "id" }, "name")
          .whereIn(t.raw('LOWER("name")') as any, members);

我对原始代码的更改是

  1. 引号:交换了 " 和 '
  2. lower、Lower 和 LOWER 工作
  3. Typescript 错误:添加为 any

感谢 Matt 和 Mikael 的指导。

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2018-12-08
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2019-06-22
    相关资源
    最近更新 更多