【问题标题】:Concat is not working in mysql inclauseConcat 在 mysql in 子句中不起作用
【发布时间】:2015-07-24 09:11:54
【问题描述】:

请帮助我,我尝试如下获取类别列表,其中类别 ids 在 inclause 中传递,它返回两行。

mysql> select c_id,c_name from category where c_id in (870,854);
+------+---------------+
| c_id | c_name        |
+------+---------------+
|  854 | Telugu        |
|  870 | Telugu Events |
+------+---------------+

虽然相同的类别 id 被连接并作为参数传递给 inclause,但它只返回两行中的一行。

mysql> select c_id,c_name from category where c_id in (select concat(870,',',854) as c_id);
+------+---------------+
| c_id | c_name        |
+------+---------------+
|  870 | Telugu Events |
+------+---------------+

请澄清一下。

谢谢。

【问题讨论】:

  • 粗略地说,在 SQL 中以 CONCAT(或 GROUP_CONCAT)为解决方案没有问题。如果您发现自己在使用这些函数,那么您可能做错了什么。

标签: mysql concat in-clause


【解决方案1】:

我找到了解决办法,

SELECT c_id, c_name 
FROM category 
WHERE FIND_IN_SET(c_id, (SELECT CONCAT(870,',',854) AS c_id))

谢谢。

【讨论】:

    【解决方案2】:

    不确定为什么要在in-clause 中使用concat,当您有一些动态数据时需要这样做,为此您需要使用prepare 进行动态查询

    这里是怎么做的

    set @c_id := concat(870,',',854);
    set @qry = concat("select * from category where c_id in (",@c_id,")");
    
    prepare stmt from @qry;
    execute stmt;
    

    DEMO

    【讨论】:

    • 嗨,实际上我修改了查询以便于理解,下面是确切的查询,其中类别 id 输入会像''-854-870-'',所以我使用字符串替换函数来转换到 854,870 以在 mysql in 子句中传递它,但它不返回两个结果行。 select c_id,c_name from category where c_id in (select REPLACE(trim('-' from '-854-870-'),'-',','));
    • 您应该使用应用程序级别进行此类替换,然后将它们传递到查询中。
    • 是的,你的建议是正确的,但我很想知道为什么这在查询中不起作用。
    • 当您在IN 子句中将某个值作为字符串传递时,它将被视为字符串,mysql 将获得第一条记录的结果。这就是为什么您需要使用 concat 的动态 sql,就像我在答案中显示的那样。这样整个查询都在一个变量中,然后在该变量中执行查询。
    • 非常感谢您的宝贵建议 :)
    猜你喜欢
    • 2023-03-07
    • 2018-04-23
    • 2013-01-26
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多