【问题标题】:How to return a certain set of sub-strings using SQL如何使用 SQL 返回一组子字符串
【发布时间】:2012-10-22 07:46:46
【问题描述】:

使用MySQL,有x = 'aa.bb.cc',如何获取列表'aa.bb.cc', 'aa.bb', 'aa'

使用x = '39.01',列表为'39.01', '39'

使用x = '39.02.01.01',列表为'39.02.01.01', '39.02.01', '39.02', '39'

从上面使用x = '39.02.01.01' 的最后一个示例中,我希望能够构造如下内容:

SELECT ... FROM ... WHERE foo IN bar

其中bar 动态获取为('39.02.01.01', '39.02.01', '39.02', '39')

任何想法都将不胜感激。

【问题讨论】:

  • 这似乎是对 MySQL 的滥用……你能给我们一些背景信息吗?你想做什么?
  • @Lübnah:我只是想看看我是否可以在“sql”中保留一些东西,以保持一些与代码无关的需求。我知道我的问题不是很清楚;明天早上我可能会很清楚,尤其是有一些有用的答案和 cmets。

标签: mysql sql loops recursion


【解决方案1】:

我希望 INSTRLOCATE 函数对你有用:

 SELECT * from TABLE table1 WHERE INSTR(bar, foo) = 1;

 SELECT * from TABLE table1 WHERE LOCATE(foo, bar) =1 ;

这里bar 可以是39.02.01.01foo 可以是子字符串,例如'39.02.01.01', '39.02.01', '39.02', '39'.

【讨论】:

  • 这可能会起作用,但如果它存在,它会返回'02.01.01' 吗?
  • 你用这个解决方案打败了我 2 秒。我得到了几乎完全相同的反应。一个区别应该是: WHERE (instr(bar, foo) = 1) --- instr() 在 bar 中找不到 foo 时返回 0,当 bar 以 foo 开头时返回 1。
【解决方案2】:

您是否考虑过使用 SUBSTRING_INDEX?

类似这样的:

SELECT SUBSTRING_INDEX(field1,".",4) as One, SUBSTRING_INDEX(field1,".",3) as Two,
 SUBSTRING_INDEX(field1,".",2) as Three, SUBSTRING_INDEX(field1,".",1) as Four FROM Test

如果您的值并非都包含相同数量的“分隔符”,则结果可能不是您想要的,我至少需要再喝几杯咖啡来考虑解决此类问题: -)

【讨论】:

  • 您肯定需要再喝一杯咖啡,您对所有列都使用了相同的别名as One。 :)
  • 是的,让我再买一个... :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2020-05-11
相关资源
最近更新 更多