【问题标题】:Convert a string of comma separated values into values for mysql stored procedure将一串逗号分隔值转换为 mysql 存储过程的值
【发布时间】:2020-10-12 11:04:52
【问题描述】:

我正在为 mysql 编写一个存储过程。我正在使用 xampp localhost 和 mariadb。

存储过程接收一个整数ID,并根据ID从数据库中查找字符串。此字符串包含一个数字列表,以逗号分隔。

我需要在我的 SQL 查询中为 IN 子句使用这串数字。

CREATE PROCEDURE Test(IN id INT)
BEGIN
DECLARE clist VARCHAR(255);

SELECT clists INTO clist
FROM camp 
WHERE cid = id ;

现在 clist,一个 varchar 变量包含一个字符串中的值列表,例如 4,6,8。

SELECT  DISTINCT  email
FROM table
WHERE ( col1 IN (clist) OR  col2 IN (clist)

所以在mysql中,查询变成了这样,并且只获取一个ID为4。

SELECT  DISTINCT  email
FROM table
WHERE ( col1 IN ('4,6,8') OR  col2 IN ('4,6,8')

我希望它变成

SELECT  DISTINCT  email
FROM table
WHERE ( col1 IN (4,6,8) OR  col2 IN (4,6,8)

我的问题是 - 如何从字符串中删除单引号?

谢谢。

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    使用 FIND_IN_SET 可能是最简单(最糟糕的)

    WHERE FIND_IN_SET(col1, clist) > 0 OR FIND_IN_SET(col2, clist) > 0 
    

    【讨论】:

    • >0 在 MySQL/MariaDB 中是多余的。过度比较,没有利润。
    • 我一直更喜欢明确而不是依赖虚假/真实;对我来说,利润在于对代码的理解。 WHERE x>0 很明显是布尔值,自我记录并且很明显如何修改它以翻转逻辑,WHERE x 要求开发人员知道相关的数据库运行支持真/假,无论输出是兼容的真/假,并且它不能很好地传输到其他数据库/编程语言。如果它将 10 分钟的查询变成 3 秒的查询,那很好.. 但对我来说,批评者比吸引者多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2012-06-18
    相关资源
    最近更新 更多