【问题标题】:how to use replace function with in clause in mysql如何在mysql中使用带in子句的replace函数
【发布时间】:2012-07-07 16:53:44
【问题描述】:

我想要将输出作为连接字符串输出的 sql 查询

Sql 查询

SELECT GROUP_CONCAT(nm) FROM xyz WHERE xyz.id IN (REPLACE(abc,"|",','))

其中 abc 是类似于 1|2|3|4 的字符串,它是 xyz 表的 id 上面的查询只给出 abc 中第一个 id 的 nm。它创建的查询类似于

SELECT GROUP_CONCAT(nm) FROM xyz WHERE xyz.id IN ("1,2,3,4")

so (") 可能会产生任何人都可以提供帮助的问题。

【问题讨论】:

  • @ChrisGessler - 这是标记为 MySQL,您在 SQL Server 中链接的问题。
  • @Dems - 仍然与动态 IN 子句相关,并提到了几种解决方案,如实现拆分函数等......相同的技术可以轻松应用于 MySql

标签: mysql sql


【解决方案1】:

你可以使用LIKE,(但它不会使用索引)

SELECT GROUP_CONCAT(nm)
FROM xyz
WHERE CONCAT('|', abc, '|') LIKE CONCAT('%|', xyz.id, '|%');

【讨论】:

  • MySQL 有用户定义的表值函数吗?所以OP可以使用WHERE id IN ((SELECT split(@list, ,))?
【解决方案2】:

你可以像这样使用INSTR

SELECT GROUP_CONCAT(nm) 
FROM xyz 
WHERE INSTR(CONCAT('|', abc, '|'), CONCAT('|', xyz.id, '|')) > 0

或者您可以实现拆分函数或使用动态 SQL。

【讨论】:

  • instr 和 like 有速度差异吗?
  • @AndriyM 我知道 LIKE 可以比 INSTR 做更多的事情,但是如果您只需要 INSTR 的功能,我是否可以使用 INSTR 获得更快的查询,或者我可以像以前一样继续使用 LIKE 跨度>
  • @PugganSe:是的,这就是我在您的问题中遗漏的内容,这就是我删除评论的原因。我希望你不会看到它,我错了。 :) 对不起我的愚蠢。
猜你喜欢
  • 1970-01-01
  • 2018-09-26
  • 2011-10-11
  • 2011-06-08
  • 2014-10-29
  • 1970-01-01
  • 2020-04-18
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多