2015-07-21 179 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