简答
是的,这是可能的。从技术角度来看,您可以通过一个查询来实现。但问题是 - 很可能,您正试图将一些逻辑从应用程序传递到数据存储。数据存储旨在存储数据,而不是表示/格式化它,或者甚至对其应用一些逻辑。
是的,MySQL 没有数组数据类型,但在大多数情况下它不会成为问题,并且可以创建体系结构,从而满足这些限制。在任何情况下,即使您以某种方式实现它(如 - 见下文) - 您稍后将无法正确使用该数据,因为它只是结果集。当然,您可以存储它 - 比如说,稍后建立索引,但它又是应用程序的一项任务 - 因此创建该导入。
另外,请确保它不是 Jaywalker 的情况,因此不要存储分隔符分隔的值,然后再尝试提取它们。
长答案
从技术角度来看,您可以使用两个行集的Cartesian product 来做到这一点。然后使用一个众所周知的公式:
N = d1x101 + d2x102 + ...
因此,您将能够创建一个“全数字”表,然后对其进行迭代。那个迭代,连同 MySQL string functions,可能会导致你得到这样的结果:
SELECT
data
FROM (
SELECT
@next:=LOCATE(@separator,@search, @current+1) AS next,
SUBSTR(SUBSTR(@search, @current, @next-@current), @length+1) AS data,
@next:=IF(@next, @next, NULL) AS marker,
@current:=@next AS current
FROM
(SELECT 0 as i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) as n1
CROSS JOIN
(SELECT 0 as i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) as n2
CROSS JOIN
(SELECT
-- set your separator here:
@separator := ',',
-- set your string here:
@data := '1,25,42,71',
-- and do not touch here:
@current := 1,
@search := CONCAT(@separator, @data, @separator),
@length := CHAR_LENGTH(@separator)) AS init
) AS joins
WHERE
marker IS NOT NULL
对应的小提琴是here。
您还应该注意:这不是一个函数。并且使用函数(我的意思是,用户使用CREATE FUNCTION 语句定义)不可能获得结果行集,因为 MySQL 中的函数无法根据定义返回结果集。但是,不能说完全不可能使用 MySQL 执行请求的转换。
但请记住:如果你能做某事,那并不意味着你应该去做。