将逗号分隔的字符串转换为列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将逗号分隔的字符串转换为列表相关的知识,希望对你有一定的参考价值。

我想传递一个int(逗号分隔)列表,这是我表中的一个字段

即。 1234,2345,356,4567

我在INWHERE条款。但是列表是一个字符串(VARCHAR),我正在比较一个int字段。有没有办法让我将列表转换为整数列表?

Enterprise_IDINT Path是表中的一个字段,它是一个逗号分隔的字符串

即。 1234,2345,356,4567

SELECT *
FROM tbl_Enterprise
WHERE Enterprise_ID IN ( Path )

我的数据库是Vertica。

答案

您可以在vertica中使用SPLIT_PART函数将逗号分隔列表拆分为行并将它们插入临时表中。使用类似这样的查询来实现您的目标:

SELECT * FROM tbl_Enterprice WHERE Enterprice_ID IN ( Select Enterprice_ID from temp_table )

拆分功能:https://my.vertica.com/docs/7.1.x/HTML/Content/Authoring/SQLReferenceManual/Functions/String/SPLIT_PART.htm

以下是使用split_part将字符串拆分为行的示例:

dbadmin=> SELECT SPLIT_PART('JIM|TOM|PATRICK|PENG|MARK|BRIAN', '|', row_num) "User Names"
dbadmin->   FROM (SELECT ROW_NUMBER() OVER () AS row_num
dbadmin(>           FROM tables) row_nums
dbadmin->  WHERE SPLIT_PART('JIM|TOM|PATRICK|PENG|MARK|BRIAN', '|', row_num) <> '';
 User Names
------------
 JIM
 TOM
 PATRICK
 PENG
 MARK
 BRIAN
(6 rows)
另一答案

我认为这两种解决方案都是反模式,并建议测试它们的性能。

第一种方法使用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)
另一答案

Abnay建议的解决方案略有改进:

SELECT SPLIT_PART('JIM|TOM|PATRICK|PENG|MARK|BRIAN|AAA', '|', row_num) "User Names"
FROM (SELECT ROW_NUMBER() OVER () AS row_num FROM columns) row_nums
WHERE  REGEXP_COUNT('JIM|TOM|PATRICK|PENG|MARK|BRIAN|AAA', '|') + 2 > row_num
另一答案

为什么不使用find_in_set

SELECT *

FROM tbl_Enterprise WHERE FIND_IN_SET(Enterprise_ID,Path)

另一答案

字符串连接是一项繁重的任务,所以我建议你避免它。由于您决定将它们保存为字符串而不是创建“父子”表,我建议您以这种方式保存它们,1234,2345,3456,4567,(在值的开头和结尾添加一个)并修剪所有空间)。

然后你可以轻松地用sql搜索,例如:

SELECT * FROM tbl_Enterprice WHERE Enterprice_ID like ('%,your_value,%')

以上是关于将逗号分隔的字符串转换为列表的主要内容,如果未能解决你的问题,请参考以下文章

如何将逗号分隔的字符串转换为 Python 中的列表?

将逗号分隔的字符串转换为Python中的列表

使用 Python 将多个字符串元素列表转换为单个元素以逗号分隔的列表

javascript 将字符串数组转换为以逗号分隔的列表

如何将空格和逗号分隔的数字字符串转换为 int 列表? [复制]

将结果转换为逗号分隔列表