【问题标题】:query on FIND_IN_SET查询 FIND_IN_SET
【发布时间】:2014-02-19 11:42:05
【问题描述】:

以下查询

SELECT ASSOCIATED_RISK 
FROM PROJECT_ISSUES
 WHERE FIND_IN_SET('98',ASSOCIATED_RISK);

返回输出为

96,98

90,98

但是如果我使用

SELECT ASSOCIATED_RISK
FROM PROJECT_ISSUES 
 WHERE FIND_IN_SET('96,98',ASSOCIATED_RISK);

它不返回任何东西。在这种情况下,我想检索第一行。

96,98

【问题讨论】:

  • 首先规范你的结构

标签: mysql find-in-set


【解决方案1】:

使用AND 子句,如下所示:

SELECT ASSOCIATED_RISK 
FROM PROJECT_ISSUES 
WHERE FIND_IN_SET('96',ASSOCIATED_RISK)
AND FIND_IN_SET('98',ASSOCIATED_RISK)

您的查询失败,因为如果第一个参数包含逗号 (",") 字符,FIND_IN_SET() 将无法正常工作。参考:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set。在你的情况下,第一个参数是'96,98',所以它失败了。

【讨论】:

  • 这给出了正确的结果。但是有没有其他方法可以在单个查询中获取它,而不是构建多个 find_in_set 并连接它们?
  • @user1650864 抱歉,除非您可以更改表结构,否则我认为这是不可能的。理想情况下,逗号分隔值不应存储在数据库列中
  • 好的。感谢您的帮助。
【解决方案2】:

您的评论:

有没有其他方法可以在单个查询中获取它,而不是构建多个 find_in_set 并连接它们

作为替代解决方案,您可以在您的 ASSOCIATED_RISK 值上使用 locate

示例

locate( replace( '96,98', ',', '' ), replace( ASSOCIATED_RISK, ',', '' ) )

编辑
根据Aziz Shaikh 的评论,我们可以看到虽然目标字符串中不存在搜索字符串,但结果可能是 true

作为替代解决方案,您可以将目标字符串中的搜索字符串替换为空字符串并比较长度。如果原始字符串的长度大于新替换的字符串,那么它是 found true 结果。

示例

-- this should be greater than 0 for a found true
length( ASSOCIATED_RISK ) > length( replace( ASSOCIATED_RISK, '96,98', '' ) )

【讨论】:

  • @user1650864 这可行,但请注意ASSOCIATED_RISK 是否包含类似于'9698,97' 的值,上述查询也将返回'9698,97',因为它替换了, 和以字符串形式搜索。
  • @AzizShaikh:你是对的。另一种解决方案是将搜索字符串替换为目标字符串中的空字符串,并将长度与> 进行比较以获得 found true
  • @user1650864:在我建议的解决方案中发现了一个错误。我已经更新了一个替代方案。
  • @Ravinder 将length 部分与locate 部分一起使用AND 吗?
  • 没有。 Find_in_set 仅在按顺序找到时才返回 true。对于逆序搜索,它不起作用。您需要选择不同的方法。
【解决方案3】:

这将给出结果。看到不同。

SELECT ASSOCIATED_RISK FROM PROJECT_ISSUES WHERE FIND_IN_SET(ASSOCIATED_RISK,'96,98');

【讨论】:

  • 对不起。这也没有给出结果。
  • 在这基本上,我发现语法不正确。使用我的查询。肯定会给出你预期的结果:) 谢谢。
  • 我想不出来。给你的架构我会给你的结果。通过使用单个 FIND_IN_SET 函数,我们可以获取逗号分隔值的多个结果。
猜你喜欢
  • 2016-10-22
  • 1970-01-01
  • 2017-09-03
  • 2017-08-25
  • 1970-01-01
  • 2014-08-15
  • 2013-04-03
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多