我会考虑这两种解决方案是反模式,并建议检测其性能。
第一种方法使用了flex表包中的函数。
SELECT values::INT as var1
FROM (
SELECT MapItems(v1) OVER() AS (keys, values)
FROM (
SELECT MapDelimitedExtractor('1234, 2345, 3456, 4567'
USING PARAMETERS DELIMITER=',') AS v1
) AS T
) AS T2
WHERE REGEXP_SUBSTR(values,'\d+',1) IS NOT NULL;
var1
------
1234
2345
3456
4567
(4 rows)
第二种方法使用来自文本索引包中的函数。
SELECT words::INT AS var1
FROM (
SELECT TxtIndex.StringTokenizerDelim('1234, 2345, 3456, 4567',',')
OVER() AS (words, input_string)
) AS T
WHERE REGEXP_SUBSTR(words, '\d+',1) IS NOT NULL;
var1
------
1234
2345
3456
4567
(4 rows)
你有没有对数据库的结构控制?列中以逗号分隔的整数列表强烈暗示您的数据库结构是错误的。 –
@MattGibson我认为实际问题是他作为参数传递给查询(逗号分隔数字的varchar列表),而不是数据库结构。 –
@RaduGheorghiu在一列中存储多个值是一个结构问题。 – Kermit