2015-07-21 181 views
5

我想通过INT的列表(用逗号隔开),这是在我的表转换逗号分隔字符串列表

即场。 1234,2345,3456,4567

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

Enterprise_IDINT
路径是在表中的字段,其是逗号分隔的字符串

即1234,2345,3456,4567

SELECT * 
FROM tbl_Enterprise 
WHERE Enterprise_ID IN (Path) 

我的数据库是Vertica。

+2

你有没有对数据库的结构控制?列中以逗号分隔的整数列表强烈暗示您的数据库结构是错误的。 –

+0

@MattGibson我认为实际问题是他作为参数传递给查询(逗号分隔数字的varchar列表),而不是数据库结构。 –

+0

@RaduGheorghiu在一列中存储多个值是一个结构问题。 – Kermit

回答

4

您可以使用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) 
+1

感谢您的建议,但Split_Part用于获取字符串的一个特定部分。我如何使用split_part获取用逗号分隔的所有ID? – Neha

+0

我已经添加了一个使用split_part将字符串拆分成行的示例。请调整它以适合您的使用。 希望这有助于! –

-2

字符串连接是一个沉重的任务,所以我会建议你避免它。既然你决定把它们保存为一个字符串,而不是创建一个“父子”表,我建议你这样保存它们,1234,2345,3456,4567,(在你的值的开始和结尾添加一个并修剪所有空间)。

然后,你可以轻松地与SQL搜索,例如:

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

我会考虑这两种解决方案是反模式,并建议检测其性能。

第一种方法使用了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) 
0

的解决方案略有改善版本的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