3

我知道将列表存储为字符串是不明智的,但我必须处理这个问题才能导出一些以这种方式存储的数据。我也知道这个FIND_IN_SET函数,它返回列表中某个字符串的索引:

SELECT FIND_IN_SET('bar', 'foo,bar,baz');
-- selects 2

是否有任何内置函数(或函数组合)来获取列表特定索引中的字符串?我正在寻找这样的东西:

SELECT IN_SET_AT_INDEX(2, 'foo,bar,baz');
-- selects 'bar'

如果可能的话,我想避免使用类似拆分的函数使列表成为单独的表。

4

2 回答 2

8

SUBSTRING_INDEX()可以做到这一点,有点:

mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('foo,bar,baz', ',', 2), ',', -1) AS middle_one;
+------------+
| middle_one |
+------------+
| bar        |
+------------+
于 2013-07-11T18:40:49.807 回答
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'
于 2013-07-11T18:40:18.250 回答