【问题标题】:MySQL Split to use in "SELECT WHERE IN" statementMySQL Split 在“SELECT WHERE IN”语句中使用
【发布时间】:2011-01-12 05:16:22
【问题描述】:

我一直在搜索各种 MySQL 站点,希望能找到一些可以让我改变它的东西:

var parameters = "a,b,c,d"; // (Could be any number of comma-delimited values)

进入这个(假设我的参数以某种方式成为您在 IN 块中看到的值):

SELECT * FROM mytable WHERE parametertype IN('a', 'b', 'c', 'd');

但我并没有取得很大的成功!我找到的最好的网站是:dev.mysql.com,它讨论了基于分隔符(在我的例子中是“,”)的字符串拆分,尽管它没有找到任何答案......

有没有人知道将逗号分隔的字符串拆分为可在此上下文中使用的一组字符串的好方法?

【问题讨论】:

  • 你想通过mysql还是c#来分割字符串?
  • 您好 TGadfly,我将从 C# 传递类似 "'a','b','c'" 到 SQL 中,以便使用 IN('a','b',' c')但当然(索德定律)不起作用!感谢您的来信!

标签: c# sql mysql csv


【解决方案1】:

它可能没有您需要的所有灵活性,但 MySQL FIND_IN_SET 函数可能就足够了。 但是,要与之比较的集合中的值最多为 64 个。

例如:

SELECT  *
FROM    mytable
WHERE   FIND_IN_SET( parametertype, 'a,b,c,d' ) != 0

这是一个使用内联 MySQL SET ('a,b,c,d') 的示例 - 它是一种枚举。 可能表明,如果正在使用这些数据模型的规范化出现问题。但是,它们可以很方便地消除连接,或者(如在本例中)与驻留在数据库外部的复杂信息相关联。

【讨论】:

  • 精湛的回答马丁!我试图应用 WHERE 子句并让自己陷入正确的混乱中,弄清楚它为什么不起作用!非常感谢!
【解决方案2】:

你可以使用动态sql


delimiter //; 
create procedure tst() 
begin 
prepare stmp from 'INSERT INTO LOGG SELECT PFILE_Filename FROM PFILE_FILE'; 
execute stmp; 
deallocate prepare stmp; 
end// 
delimiter ;//

你必须这样做

你有一部分的sql查询

 SELECT * FROM mytable WHERE parametertype IN( 
然后使用 CONCAT 函数将其与作为参数 "'a', 'b', 'c', 'd'" 传递的字符串连接起来 例如像上面那样进入 stmp 然后执行 stmp

【讨论】:

  • TGadfly,这个 PFILE 是什么?不好意思打扰你了!
  • 这只是一个将字符串作为 sql 执行的示例,如果您将字符串 'a','b' 作为参数传递,则可以动态创建此字符串 mysql 将其识别为字符串,但如果您加入它以另一个字符串结尾然后调用执行 your_string_name 它将被识别为参数数组
  • 这不会让我对 SQL 注入持开放态度吗?
  • 任何方式。使用一些过滤器
猜你喜欢
  • 2010-12-07
  • 2016-12-29
  • 1970-01-01
  • 2021-12-23
  • 2010-12-23
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多