我知道将列表存储为字符串并不明智,但我必须处理这些以导出存储的一些数据。我也知道FIND_IN_SET
函数,它返回列表中某个字符串的索引:
SELECT FIND_IN_SET('bar', 'foo,bar,baz');
-- selects 2
是否有任何内置函数(或函数组合)来获取列表特定索引中的字符串?我正在寻找这样的东西:
SELECT IN_SET_AT_INDEX(2, 'foo,bar,baz');
-- selects 'bar'
我想避免使用类似分割的函数,如果可能的话,使列表成为一个单独的表。
答案 0 :(得分:8)
SUBSTRING_INDEX()
可以做到这一点,等等:
mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('foo,bar,baz', ',', 2), ',', -1) AS middle_one;
+------------+
| middle_one |
+------------+
| bar |
+------------+
答案 1 :(得分:1)
是的,但它需要一点点诡计。基础是substring_index()
,但是这样可以获得第n个条目。然后我使用reverse()
两次和另一个substring_index()
:
select reverse(substring_index(reverse(substring_index('foo,bar,baz', ',', 2)), ',', 1))
在您的情况下,转换是:
original string: 'foo,bar,baz'
after substring_index(..., 2) 'foo,bar'
after inner reverse 'rab,oof'
after substring_index(..., 1) 'rab'
after outer reverse 'bar'