【问题标题】:Mysql select where field in csv stringMysql选择csv字符串中的where字段
【发布时间】:2010-11-24 09:55:24
【问题描述】:

我想从一个表中进行选择,其中一个字段位于传递给存储过程的给定 csv 字符串中。

最快的方法是什么?我应该将值插入临时表并加入吗?或者有没有办法用一个语句来做到这一点?

谢谢

【问题讨论】:

    标签: mysql csv


    【解决方案1】:

    做了一些搜索,找到了一个很好的答案。:)

    使用MySql的字符串函数FIND_IN_SET

    使用示例:

    SET @csvStr = "val1,val2,val3";
    
    SELECT Col1
      FROM Table1
     WHERE FIND_IN_SET(Col2, @csvStr) > 0;
    

    我用“新答案”和“旧答案”编辑了当前答案,指出新答案会使您的系统面临 SQL 注入漏洞。

    【讨论】:

      【解决方案2】:

      新答案-

      你必须按照下面给出的那样做。 我假设您的 csv 字符串将在下面的变量 @str 中给出。否则,您需要确保您的字符串(或数组字符串)应该具有这种格式,每个元素都带有单引号 -

      set @str = "'some1','some2','some3'";
      set @qry1 = CONCAT('select * from testing where col1 in (',@str,')');
      
      prepare stmt1 from @qry1;
      execute stmt1;
      deallocate prepare stmt1; 
      

      旧答案-

      我假设您会将 csv 文件路径传递给存储过程,并读取该存储过程中 csv 中的行。所以基本上你可以将所有这些 csv 字段值存储在临时表中并使用 IN 编写查询 -

      select * from sourceTable 
      where fieldValue in (select csvFieldValue from #temptable)
      

      【讨论】:

      • 不,它不是文件,只是作为参数传递的文本字段,如“token1,token2,token3”等。
      • @Chris - 编辑了我的答案。用给定的字符串测试,它工作正常。您可能需要对您拥有的字符串数组进行一些操作。
      • 必须对代理中的字符串进行一些操作才能获得正确的引号,但效果很好,谢谢!
      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 2011-09-22
      • 2022-11-17
      相关资源
      最近更新 更多