在 PostgreSQL 中使用 1 个查询选择特定行的最佳方法?

2023-12-02

我有一个 Java 应用程序,要求我在给定特定条件的情况下查找特定记录。例如,我有一张桌子:

id song artist record_label
1 Never Gonna Give You Up Rick Astley Rickroll'd Records
2 Blackbird The Beatles Apple Records
3 Yesterday The Beatles Apple Records
4 WonderWall Oasis Columbia Records

我想根据特定条件批量查询其中的子集。类似于:

SELECT id FROM songs 
WHERE 
  (song = 'Blackbird' AND artist = 'The Beatles' AND record_label = 'Apple Records') OR 
  (song = 'WonderWall' AND artist = 'Oasis' AND record_label = 'Columbia Records') OR 
  (song = 'Yesterday' AND artist = 'The Beatles' AND record_label = 'Apple Records')

应用程序将从用户处接收这些条件,并可能尝试查找数千条这样的记录。因此,我希望找到一种方法来做到这一点,而无需任何 SQL 注入,并且查询次数尽可能少。

我的第一个方法是一些PreparedStatement 的风格,我通过这个SQL 查询迭代来查询每个单独的记录:

SELECT id from songs WHERE song = ? AND artist = ? AND record_label = ?

这可以防止 SQL 注入,但我觉得这可以进一步优化,因为我们在几秒钟内用数千个这样的请求来敲击数据库。

另一种选择是创建一个临时表,将我们传递的条件导入到临时表中,并对歌曲表执行 INNER JOIN,以仅检索两者之间匹配的行。这解决了这两个问题,但需要大量的开发工作。

我想知道是否还有其他我没有考虑到的方法。在此先感谢您的任何建议!


我能想到的一种方法是将参数作为 JSON 字符串传递,然后你可以有一个参数:

SELECT id 
FROM songs 
WHERE (song, artist, record_label) 
        in (select item ->> 'song', 
                   item ->> 'artist', 
                   item ->> 'record_label'
            from jsonb_array_elements(cast(? as jsonb)) as p(item)
            );

该参数将是一个字符串传递PreparedStatement.setString().

对于您的示例查询,例如

[
   {"song": "Blackbird", "artist": "The Beatles", "record_label": "Apple Records"},
   {"song": "Wonderwall", "artist": "Oasis", "record_label": "Columbia Records"},
   {"song": "Yesterday", "artist": "The Beatles", "record_label": "Apple Records"}
]

不确定性能,但OR条件通常是性能杀手,因此解析和取消嵌套 JSON 数组的小开销不会产生太大影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PostgreSQL 中使用 1 个查询选择特定行的最佳方法? 的相关文章

随机推荐

  • 找不到 SQL Server 配置管理器

    安装SQL Server 2008后 我找不到SQL Server Configuration Manager in Start SQL Server 2008 Configuration Tools menu 我应该做什么来安装这个工具
  • 不可为空类型 'System.DateTime' ,ASP.NET MVC

    我有一个注册页面 由于内容问题 我们必须要求并强制申请人提供出生日期 所以按理说这个字段不能为空 我使用 jQuery 在文本框上加水印 告诉他们可以单击它并获取 jQuery UI 日历对象来选择日期 选择日期效果很好 这不是问题 在测试
  • 重写 App.xaml.cs 中的方法值

    我正在开发 Windows 8 Phone 应用程序 我这里有两件事 一个是库项目 另一个是普通应用程序 让我首先解释一下我的代码 在图书馆项目中 class A public static string empName ABC publi
  • 如何从 .ipa 文件获取源代码? [复制]

    这个问题在这里已经有答案了 可能的重复 是否可以对我的 iPhone 应用程序进行逆向工程 我正在为客户构建一个应用程序 并希望向他发送我创建的每个构建的 ipa 文件 以便他可以使用该应用程序 然而 在他付钱给我之前 我不希望他能够访问源
  • 如何将SwingWorker的publish委托给其他方法

    我的 问题 可以用以下方式描述 假设我们有一个密集的进程 我们希望在后台运行并让它更新 Swing JProgress 栏 解决方案很简单 import java util List import javax swing JOptionPa
  • 在 Mac OSX 上使用 MAMP 时,如何让 CakePHP Baker 找到 mysql.sock 并识别 MySQL?

    我目前正在阅读 David Golding 的 Beginning CakePHP From Novice to Professional 在某一时刻 我必须使用 CLI 命令 蛋糕烘焙 我会看到欢迎屏幕 但当我尝试烘焙时 例如 控制器我收
  • c++ 11 mersenne_twister_engine 类的问题

    我一直在尝试使用 c 11 mersenne twister engine 类 http www cplusplus com reference random mersenne twister engine 生成区间 0 1 中的数字 但是
  • create-react-app 自版本 4.0.1 起不再工作

    我尝试安装create react app using npm i create react app npx create react app new app and npm init react app new app 但我不断收到此错误
  • 如何使用甲骨文钱包

    我正在尝试将密码存储在 Oracle Wallet 文件中 我将从代码中检索并使用该文件 我尝试创建一个钱包并在那里保存凭证 mkstore wrl
  • “OPEN_URI”的菜单项不存在于菜单项返回中

    我有一张卡片正在通过镜像 API 插入到我的时间线中 该卡有 3 个选项 扫描 回复 删除 预期 gt 条码测试 扫描 回复 删除 已收到 gt 条码测试 回复 删除 回复和删除选项仅在菜单项上返回 如果我将 OPEN URI 更改为 CU
  • 替换列中匹配的值

    我是 R 编程新手 我一直停留在下面的示例上 基本上我有两个数据集 数据集1 ID Category 1 CatZZ 2 CatVV 3 CatAA 4 CatQQ 数据集2 ID Category 1 Cat600 3 Cat611 我试
  • Unity中如何减少VR游戏的延迟

    我一直在使用 Unity3d 构建 VR 游戏 它只有低多边形模型 文件大小小于 40 mb 但在移动设备上玩游戏时仍然滞后 请建议如何提高性能 先感谢您 为了提高移动 VR 的性能 您必须尽可能优化一切 您应该牢记以下一些变量 图形方面
  • Django 自引用外键

    一般来说 我对网络应用程序和数据库的东西比较陌生 所以这可能是一个愚蠢的问题 我想创建一个模型 CategoryModel 其中的字段指向模型的另一个实例 其父级 的主 ID class CategoryModel models Model
  • 用下划线替换文件名中的括号和空格

    我用这一行删除文件夹名称上的空格 find tmp depth name execdir rename s g 有没有办法从文件名中删除空格和括号并添加下划线 例如 我有 a dir 1 file with spaces and paren
  • XSLT:从 xsd 获取枚举

    我在 xsd 文件中有这个枚举
  • 什么是 Unix 时间戳以及为什么使用它?

    什么是 Unix 时间戳 在 PHP 中 当处理日期时 该函数strtotime 输出一些整数值 那是什么 我试图了解这一点 但我无法得到满意的答案 特别是为什么我们需要使用转换日期strtotime 什么是 Unix 时间戳 简而言之 U
  • 使用 CSOM 对 Sharepoint Online 进行身份验证

    我觉得我在这里错过了一些东西 我尝试通过 C 控制台应用程序登录 SPO 租户 但收到错误 无法联系网站 https xxx sharepoint com 或者网站不支持 SharePoint Online 凭据 响应状态代码为 未经授权
  • 未声明的标识符 - 不确定为什么

    我刚学C 我写了以下内容 void main void unsigned int curr dat 0 The current dat file to use unsigned char ch 0 Key entered at keyboa
  • 在 CMake 中列出 include_directories

    我有一个 cmake 构建 其中我正在搜索一堆依赖项 即我有很多实例 FIND PACKAGE SomePackage if SOMEPACKAGE FOUND include directories SOMEPACKAGE INCLUDE
  • 在 PostgreSQL 中使用 1 个查询选择特定行的最佳方法?

    我有一个 Java 应用程序 要求我在给定特定条件的情况下查找特定记录 例如 我有一张桌子 id song artist record label 1 Never Gonna Give You Up Rick Astley Rickroll