【问题标题】:How to pass an array of integers to sql IN() query如何将整数数组传递给 sql IN() 查询
【发布时间】:2021-05-17 23:55:45
【问题描述】:

遗憾的是,在过去的两个小时里,我不知何故无法找到答案……我正在尝试将整数数组传递给 SQL IN 查询,如下所示:

"SELECT id, bio, image_url, userhandle FROM users IN ([4,6,7,8])"

当然这行不通,所以我尝试了这个,但它只适用于字符串数组。 formattedUserIds 是整数数组。

"SELECT id, bio, image_url, userhandle FROM users IN ('" + formattedUserIds.join(",") + "')"

澄清一下,基本上我需要的是转换 [4,6,7,8] -> 4,6,7,8 这样我就可以将它传递到 in 子句中,例如 IN(4,6,7,8 ) 任何帮助表示赞赏。

【问题讨论】:

  • 你可以传入一个复合数组参数和INNER JOIN作为WHERE IN的替代方案:stackoverflow.com/questions/47466801/…
  • 对不起,完整的 sql 新手。我将如何在我的代码中执行此操作? @戴

标签: sql node.js arrays postgresql


【解决方案1】:

改用ANY construct 并按原样传递数组:

SELECT id, bio, image_url, userhandle
FROM   users
WHERE  id = ANY($user_ids);

相关:

【讨论】:

    【解决方案2】:

    使用 Dai 提供的示例,您可以通过以下方式完成此操作。使用 IN 子句如下

    SELECT id, bio, image_url, userhandle 
      FROM users IN (select *
                       from unnest(ARRAY[4,6,7,8])
                    )
    
    demo
    https://dbfiddle.uk/?rdbms=postgres_12&fiddle=27ca1628fb40540f9dcf07b8c4625e6e
    

    【讨论】:

      【解决方案3】:

      我最终只是做了

        "SELECT id, bio, image_url, userhandle FROM users WHERE id IN (" + formattedUserIds.toString() + ")"
      

      谢谢!

      【讨论】:

      • 我对这个答案投了反对票,因为存在 SQL 注入的风险(并且因为使用可变参数 IN 可能无法利用缓存的执行计划)。你有什么保证formattedUserIds.toString()总是 返回一个语法正确的子字符串?如果formattedUserIds 为空怎么办?如果您使用特定于文化/区域设置的格式来格式化字符串,那么您可能会将逗号视为数字分组字符,这会破坏您的查询。等等等等。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2011-11-10
      • 2021-03-30
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多