【问题标题】:MYSQL Best way to parametrize variable values for IN clause in stored procedureMYSQL 在存储过程中为 IN 子句参数化变量值的最佳方法
【发布时间】:2022-01-16 12:34:08
【问题描述】:

我必须编写一个存储过程,在其中我想使用 IN 运算符为名为 colorId 的变量设置值,参数可以是整数 id 列表或没有 id。我想知道存储过程中的变量类型应该是什么?

其中 color_id IN (1,2,3,4);

感谢您的帮助!

【问题讨论】:

  • 这能回答你的问题吗? how to use WHERE IN mysql stored procedure
  • 所以我有整数值。如果我将 '1,2,3,4' 之类的连接作为参数值 X 让我们假设,天真的问题,在将 X 添加到 In 子句之前,我将如何删除引号? ColorId IN (X)
  • 整个查询将是一个字符串,'WHERE IN (' + '1, 2, 3, 4' + ')' 的连接将提供'WHERE IN (1, 2, 3, 4)'

标签: mysql stored-procedures


【解决方案1】:

如果您将'1,2,3,4' 之类的字符串作为单个参数发送,则查询将像您执行此操作一样运行:

where color_id IN ('1,2,3,4');

MySQL 将隐式类型转换为整数的方式,这会将值转换为仅使用前导数字的整数,并忽略第一个逗号之后的所有内容。所以它真的会像你这样做一样运行:

where color_id IN (1);

没有办法“删除”引号。查询参数的要点是,在 SQL 解析完成之前,它们不会与查询组合。因此,该参数在该表达式中被固定为单个字符串值。您不能将参数转换为离散值列表,因为这会改变查询的语法。

因此,您必须传递多个参数,为列表中的每个值传递一个参数。像这样:

...where color_id IN (?, ?, ?, ?);

并在您的客户端应用程序中使用一些函数将字符串拆分为多个参数,然后将它们不作为单个字符串值传递,而是作为多个整数值传递。

有些人尝试使用诸如使用 MySQL 的 FIND_IN_SET() 函数之类的技巧,但我不建议这样做,因为它无法使用任何索引进行优化。

您标记了这个问题,从中我推断您正在尝试编写一个接受逗号分隔整数字符串并将其用于 IN() 谓词的过程。这在存储过程中比在任何其他编程语言中更不方便,因为 MySQL 的存储过程语言不支持数组或用于拆分字符串或计算元素的良好函数。可以通过足够的努力来完成,但代码很糟糕,你很快就会希望你使用任何其他语言。

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多