将逗号分隔的字符串转换为列表
Convert comma separated string to a list
我想传递一个 int 列表(逗号分隔),它是我 table
中的一个字段
ie. 1234, 2345, 3456, 4567
我在 WHERE
中的 IN
子句。但该列表是一个字符串 (VARCHAR
),我正在与一个 int 字段进行比较。有没有办法将列表转换为整数列表?
Enterprise_ID
是 INT
路径是 table 中的一个字段,它是一个逗号分隔的字符串
即。 1234, 2345, 3456, 4567
SELECT *
FROM tbl_Enterprise
WHERE Enterprise_ID IN ( Path )
我的数据库是 Vertica。
您可以在 vertica 中使用 SPLIT_PART 函数将逗号分隔的列表拆分为行并将它们插入到临时 table 中。使用类似这样的查询来实现您的目标:
SELECT * FROM tbl_Enterprice WHERE Enterprice_ID IN ( Select Enterprice_ID from temp_table )
下面是使用 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)
字符串连接是一项繁重的任务,所以我建议您避免它。由于您决定将它们保存为字符串而不是创建 "parent-child" 表,我建议您以这种方式保存它们,1234,2345,3456,4567,(在您的值的开头和结尾添加一个 ,和 trim 所有空格)。
然后您可以使用 sql 轻松搜索,例如:
SELECT * FROM tbl_Enterprice WHERE Enterprice_ID like ('%,your_value,%')
我认为这两个解决方案是反模式,并建议测试它们的性能。
第一种方法使用 flex table 包中的函数。
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 *
来自tbl_Enterprise
WHERE FIND_IN_SET(Enterprise_ID, 路径)
我想传递一个 int 列表(逗号分隔),它是我 table
中的一个字段ie. 1234, 2345, 3456, 4567
我在 WHERE
中的 IN
子句。但该列表是一个字符串 (VARCHAR
),我正在与一个 int 字段进行比较。有没有办法将列表转换为整数列表?
Enterprise_ID
是 INT
路径是 table 中的一个字段,它是一个逗号分隔的字符串
即。 1234, 2345, 3456, 4567
SELECT *
FROM tbl_Enterprise
WHERE Enterprise_ID IN ( Path )
我的数据库是 Vertica。
您可以在 vertica 中使用 SPLIT_PART 函数将逗号分隔的列表拆分为行并将它们插入到临时 table 中。使用类似这样的查询来实现您的目标:
SELECT * FROM tbl_Enterprice WHERE Enterprice_ID IN ( Select Enterprice_ID from temp_table )
下面是使用 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)
字符串连接是一项繁重的任务,所以我建议您避免它。由于您决定将它们保存为字符串而不是创建 "parent-child" 表,我建议您以这种方式保存它们,1234,2345,3456,4567,(在您的值的开头和结尾添加一个 ,和 trim 所有空格)。
然后您可以使用 sql 轻松搜索,例如:
SELECT * FROM tbl_Enterprice WHERE Enterprice_ID like ('%,your_value,%')
我认为这两个解决方案是反模式,并建议测试它们的性能。
第一种方法使用 flex table 包中的函数。
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 *
来自tbl_Enterprise WHERE FIND_IN_SET(Enterprise_ID, 路径)