【问题标题】:Knex + Postgresql + node - how to call postgresql functions for selected columnsKnex + Postgresql + node - 如何为选定的列调用 postgresql 函数
【发布时间】:2018-10-10 05:50:01
【问题描述】:

我想在 postgresql 中检查记录是否存在并且需要布尔值。

注意:我知道 if else 检查有一些简单的方法,但我想要的是我列出的查询在 knex 中的表示。我也知道这很复杂,但只是想学习。

我知道查询,你可以在下面看到,

select exists(select 1 from test where id = XYZ);

如何用 knex 编写这个 postgresql 查询?

我试过这种方法,但它不起作用。

knex.raw(`SELECT exists(${knex(TABLE_NAME).where(CONDITIONS).select('1').toString()})`)

【问题讨论】:

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


    【解决方案1】:

    我从this useful GitHub Knex post修改了下面的代码:

    var inner = knex('test').where('id', 'XYZ').limit(1);
    var clause = knex.raw(inner).wrap('exists (', ') as result');
    knex('test').select(clause).limit(1).then(...);
    

    我觉得应该对应下面的SQL代码:

    select exists (select * from test where id = 'XYZ' limit 1) as result
    from test
    limit 1;
    

    test 上的外部查询是多余的,不需要,但除了可能是原始查询之外,我不知道有什么方法可以不对 Knex 中的表运行查询。 LIMIT 语句只是意味着它将返回一个值。

    【讨论】:

      【解决方案2】:

      你不需要在DB端做布尔转换(不会有任何性能差异):

      knex('test').select('id').where('id', 'XYZ').then(results => results.length > 0);
      

      如果您真的更喜欢select 1 而不是id,这也可以:

      knex('test').select(knex.raw('1')).where('id', 'XYZ').then(results => results.length > 0);
      

      蒂姆的回答也很好,更准确地给出了你想要做的事情,但它有点复杂。

      【讨论】:

      • 这可能是最好的答案。来自 GitHub 链接的代码必须花很多时间来模拟存在查询。
      • 我知道所有这些简单的方法,但我想知道列出查询的 knex 方法。
      • @SatyamKoyani 我会编辑问题以匹配您想问的问题
      猜你喜欢
      • 2021-01-04
      • 2020-01-17
      • 2010-12-29
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2020-04-17
      • 2016-11-10
      • 2012-09-30
      相关资源
      最近更新 更多