SQL中使用IN关键字时,因空数组替换参数导致了SQL语法错误

2023-11-19

场景
  在近期的工作中,发现了这么一个问题,在某一搜索页面,需要同时查询多种订单类型,但在页面中未选择任何订单类型,API通过UI端传来的空订单类型数组进行查询时,抛出了SQL的语法错误

原SQL :
SELECT * FROM dbo.order WHERE type IN @OrderType
  正常情况下,在UI端选入了订单类型时,SQL会被框架替换成

SELECT * FROM dbo.order WHERE type IN (1,2,3)
  非正常情况下,在UI端未选入订单类型时,SQL会被框架替换成

SELECT * FROM dbo.order WHERE type IN ()
  但总所周知,这种情况下,SQL是有语法错误的,执行会报错: Incorrect syntax near ‘)’.

如何解决?

1.从业务层考虑
对于这种问题,空数组的查询,是否是不合法的请求,需要在业务层取拦截,但这个方案因项目中大面积存在这个问题,每个方法都去修改的话修改量和工作量比较大,所以不太适合这次的修改

2.从底层框架考虑
那么通过在执行SQL替换SQL Paramater参数时进行思考与分析
通过下列SQL执行过程分析发现
SELECT * FROM dbo.order WHERE type IN @OrderType
框架会通过传入的数组参数,对于需要替换Parameter进行拆分,及传入的OrderType数组假设为1,2,3
则@OrderType参数会被拆分为@OrderType0,@OrderType1,@OrderType2,并且他们的值也会对应为1,2,3,并且此时的SQL语句也会转换成
SELECT * FROM dbo.order WHERE type IN (@OrderType0,@OrderType1,@OrderType2)
最后会通过预编译传参,执行最终SQL
SELECT * FROM dbo.order WHERE type IN (1,2,3)
所以在参数进行拆分时,如果是空数组,此时的SQL语句就会转换成
SELECT * FROM dbo.order WHERE type IN ()
这时,这是个错误的SQL,需要在底层代码进行判断了,如果是空数组时,只需要将SQL转换成
SELECT * FROM dbo,order WHERE type IN (NULL)
便能避免报错,且能符合业务,并且从SQL中虽看到的查询条件是type = NULL,但实际是不会查询出type = NULL的数据

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

SQL中使用IN关键字时,因空数组替换参数导致了SQL语法错误 的相关文章

  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 使用 jdbc 程序连接到 Open Office odb 文件

    我编写了以下代码来连接到 OpenOffice db String db C Documents and Settings hkonakanchi Desktop Test odb Class forName org hsqldb jdbc
  • 如何授予用户访问 SQL Server 中的 sys.master_files 的权限?

    我需要授予数据库用户读取权限sys master files桌子 我怎样才能做到这一点 目前用户拥有以下权限 Calling SELECT on sys master files返回空结果 我还使用以下命令测试了相同的查询sa用户按预期工作
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何解决错误:java.lang.ClassNotFoundException:io.netty.util.concurrent.GenericFutureListener?

    昨天我第一次尝试用 Java 制作 Prometheus 客户端 从 Python 开始 最后是 GoLang 是否找到示例 import io prometheus client Counter import io prometheus
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • SQL 解析键值字符串

    我有一个像这样的逗号分隔字符串 key1 value1 key2 value2 key3 value3 key1 value1 1 key2 value2 1 key3 value3 1 我想将它解析成一个如下所示的表 Key1 Key2
  • Maven 多模块项目结构问题

    自从过去几周构建我的 Maven 多模块项目以来 这是我的一次有趣的经历 当我决定使用 Maven 进行构建生命周期管理时 我有几个原因希望选择 Maven A 大多数开发团队都是分开的 这样每个团队都可以在项目中的单独模块上工作 例如团队
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • 想要从字符格式转换为带小数的数字格式

    想要将字符格式 00001000000 转换为10000 00 请帮我 我已经尝试过 select to number 00012300 9999999999 99 nls numeric characters from dual 这个脚本
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • Java String.format 向整数添加空格

    我有一小段代码 我不明白输出 此输出向我的字符串格式文本添加空格 我做错了什么吗 public class HelloWorld public static void main String args int a1 540 int a2 4
  • 当容器大小更改时,JTable 仅调整选定列的大小

    对于面板内的 JTable 如果面板变大 我如何将额外的空间仅分配给某些列 在我的例子中 分配给最后一列 尽管提供 第 3 4 列和8 将获得额外的空间 我想允许用户手动更改所有列的列大小 我尝试了 table setAutoResizeM
  • 存储过程将多个表返回到 spring jdbc 模板

    我正在使用 JdbcTemplate 从 Spring DAO 类调用存储过程 我的问题是 存储过程返回多个表 有没有办法使用 Spring JdbcTemplate 访问多个表 如果我使用jdbcTemplate queryForList
  • 将字符串中的字符向左移动

    我是 Stack Overflow 的新手 有一道编程课的实验室问题一直困扰着我 该问题要求我们将字符串 s 的元素向左移动 k 次 例如 如果输入是 Hello World 和3 它将输出 lo WorldHel 对于非常大的 k 值 它
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • oracle日期序列?

    我有一个 oracle 数据库 我需要一个包含 2 年所有日期的表 例如来自01 01 2011 to 01 01 2013 首先我想到了一个序列 但显然唯一支持的类型是数字 所以现在我正在寻找一种有效的方法来做到这一点 欢呼骗局 如果您想
  • Java泛型类型

    当我有一个界面时 public interface Foo

随机推荐

  • office2013 excel 打开时提示excel词典xllex.dll文件丢失或损坏

    今天打开Excel时 发现报错 xllex dll文件丢失或损坏 我用的是office2013 网上找了好多都是2007的dll文件 导入不了 于是乎重装office 问题解决 但还是把xllex dll烤出来做个备份吧 参考下面步骤即可
  • Sublime Text Editor Recommended Settings

    http www cnblogs com dolphin0520 archive 2013 04 29 3046237 html 转载于 https www cnblogs com jast p 4737637 html
  • 8 月份 火火火火 的 GitHub 开源项目

    本期推荐开源项目目录 1 一个清新文艺的微社区 2 虚拟桌宠模拟器 3 Docusign开源替代方案 4 单词肌肉记忆锻炼软件 5 中文对话式大语言模型 01 一个清新文艺的微社区 一个美观清新的微社区开源项目 整套系统使用 Go Zinc
  • OpenCV实战(29)——视频对象追踪

    OpenCV实战 29 视频对象追踪 0 前言 1 追踪视频中的对象 2 中值流追踪器算法原理 3 完整代码 小结 系列链接 0 前言 我们已经学习了如何跟踪图像序列中点和像素的运动 但在多数应用中 通常要求追踪视频中的特定移动对象 首先确
  • Qt实现阴影边框,可拖动,可缩放窗口(二)

    通过paintEvent来实现的 绘制方形的阴影没问题 但是绘制圆角阴影的话 发现圆角不够圆润 而且有断裂的感觉 pragma once include
  • ChatGPT引爆变革:首个被颠覆的行业揭秘!

    随着人工智能的飞速发展 自然语言处理技术逐渐渗透到内容创作领域 作为一种先进的对话型AI系统 ChatGPT正改变着传统的写作方式 本文将探讨ChatGPT如何颠覆内容创作行业 以及其中的一些引人入胜的案例 ChatGPT是基于GPT架构的
  • 蓝牙App设计2:使用Android Studio制作一个蓝牙软件(包含:代码实现等)

    前言 蓝牙聊天App设计全部有三篇文章 一 UI界面设计 二 蓝牙搜索配对连接实现 三 蓝牙连接聊天 这篇文章是 二 蓝牙搜索配对连接实现 课程1 Android Studio小白安装教程 以及第一个Android项目案例 Hello Wo
  • 习题8-8 判断回文字符串 (20分)

    本题要求编写函数 判断给定的一串字符是否为 回文 所谓 回文 是指顺读和倒读都一样的字符串 如 XYZYX 和 xyzzyx 都是回文 函数接口定义 bool palindrome char s 函数palindrome判断输入字符串cha
  • 白月黑羽教python_白月黑羽Python在线教程

    推荐白月黑羽Python在线教程 白月黑羽 站在初学者的角度为大家安排了Python学习教程 帮助大家迅速掌握程序开发技能 http www python3 vip doc tutorial python home 变量 和 注释 本文目录
  • yaml 学习笔记

    yaml学习 配置 Yet Another Markup Language 发音 j m l 1 yaml文件规则 1 区分大小写 2 使用缩进表示层级关系 3 使用空格键缩进 而非Tab键缩进 4 缩进的空格数目不固定 只需要相同层级的元
  • Spring Cache @Cacheable @CachePut @CacheEvict 讲解和使用案例

    原文链接 https blog csdn net lpw cn article details 84642647 Spring的缓存管理可谓是相当的方便 与其他功能的风格一致 同样的在需要管理的地方添加一个注解 可以是方法 也可以是类 使用
  • fortify 漏洞扫描的几种解决方式

    1 关于Log的问题 Log Forging 整个系统中 对于Log的问题最多 可以采用以下方式进行解决 解决方案如下 1 只输出必要的日志 功能上线前屏蔽大多数的调试日志 2 过滤掉非法字符 2 关于创建File Path Manipul
  • 解构与迭代器

    开始 let x y x 1 y 2 正常的写法 let x y x 1 y 2 console log x y 1 2 let x y 1 2 console log x y 1 2 加上iterator方法 如果我们希望这段代码不报错
  • 计算机二级中的9种运算问题:笛卡尔积,自然连接,交,并,选择,投影。。。

    这九种运算分为7种二元运算 2种一元运算 用文字和例子来分别解释上面几个概念 7种二元运算 1 笛卡儿积 已知 如果算X1和X2的笛卡尔积 则 首先将属性 或者叫标题 A B C 和 D E 和在一块形成新的一组标题
  • python安装bert模型_BERT模型的简单使用(Python)

    不涉及原理 只是快速开始使用 更详细的请参考官方文档 https bert as service readthedocs io en latest index html 下载预训练模型 下载可能需要一些时间 等待的时候可以先去下一步把pyt
  • 某度翻译最新版Acs-Token逆向分析

    某度翻译最新版Acs Token逆向分析 免责声明 本文章中所有内容仅供学习交流使用 不用于其他任何目的 不提供完整代码 抓包内容 敏感网址 数据接口等均已做脱敏处理 严禁用于商业用途和非法用途 否则由此产生的一切后果均与作者无关 擅自使用
  • MySQL题库(4)

    301 考虑 Web 项目的安全性 MD5 算法的不可逆性可以保证加密数据的绝对安全 判断 题 A 正确 B 错误 正确答案 B 302 符合范式的数据表设计比反范式的数据表查询性能更高 判断题 A 正确 B 错误 正确答案 B 303 相
  • 关于文件描述符的close-on-exec标志位

    引言 我们在使用一些系统调用对文件描述符进行操作时 常常会碰到是否为文件描述符赋予CLOEXEC属性的情况 例如 open函数中的flags参数可指定O CLOEXEC标志 int open const char pathname int
  • 基于TF-IDF算法个人文件管理系统——机器学习+人工智能+神经网络(附Python工程全部源码)

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 模块实现 1 数据预处理 2 词频计算与数据处理 3 数据计算与对比验证 系统测试 工程源代码下载 其它资料下载 前言 本项目旨在通过应用TF IDF算法 将新下载的课件进行自动分
  • SQL中使用IN关键字时,因空数组替换参数导致了SQL语法错误

    场景 在近期的工作中 发现了这么一个问题 在某一搜索页面 需要同时查询多种订单类型 但在页面中未选择任何订单类型 API通过UI端传来的空订单类型数组进行查询时 抛出了SQL的语法错误 原SQL SELECT FROM dbo order