2015-07-21 19 views
5

ich eine Liste von int die übergeben werden sollen (durch Komma getrennt), die ein Feld in meinem Tisch istKomma getrennte Zeichenfolge in eine Liste konvertieren

dh. 1234, 2345, 3456, 4567

zu meiner IN Klausel in WHERE. Aber die Liste ist eine Zeichenfolge (VARCHAR), und ich vergleiche mit einem int-Feld. Gibt es eine Möglichkeit für mich, die Liste in eine Liste von Ints zu konvertieren?

Enterprise_ID ist INT
Pfad ein Feld in der Tabelle ist, die eine durch Kommata getrennte Zeichenkette

dh. 1234, 2345, 3456, 4567

SELECT * 
FROM tbl_Enterprise 
WHERE Enterprise_ID IN (Path) 

Meine Datenbank ist Vertica.

+2

Haben Sie die Kontrolle über die Datenbankstruktur haben? Eine Liste von durch Komma getrennten Ganzzahlen in einer Spalte ist ein starker Hinweis darauf, dass Ihre Datenbankstruktur falsch ist. –

+0

@MattGibson Ich denke, das eigentliche Problem ist, was er als Parameter an die Abfrage (VARCHAR Liste von Komma getrennten Zahlen), nicht die DB-Struktur übergeben. –

+0

@RaduGheorghiu Das Speichern mehrerer Werte in einer Spalte ist ein Problem der Struktur. – Kermit

Antwort

4

Sie können die SPLIT_PART-Funktion in Vertica verwenden, um die kommagetrennte Liste in Zeilen aufzuteilen und sie in eine temporäre Tabelle einzufügen. Verwenden Sie eine Abfrage so etwas wie dies Ihr Ziel zu erreichen:

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

Split Teilfunktion: https://my.vertica.com/docs/7.1.x/HTML/Content/Authoring/SQLReferenceManual/Functions/String/SPLIT_PART.htm

Hier ist ein Beispiel für die Spaltung String in Reihen mit 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

Vielen Dank für Ihren Vorschlag, aber Split_Part wird verwendet, um einen bestimmten Teil der Zeichenfolge zu erhalten. Wie kann ich split_part verwenden, um alle IDs zu erhalten, die durch Kommas in Zeilen getrennt sind? – Neha

+0

Ich habe ein Beispiel hinzugefügt, um einen String mit Split_Part in Zeilen aufzuteilen. Bitte optimieren Sie es für Ihre Verwendung. Hoffe das hilft !! –

-2

String Verkettung eine schwere Aufgabe, also würde ich Ihnen vorschlagen, es zu vermeiden. Da Sie sich entschieden haben, sie als String zu speichern und keine "Eltern-Kind" -Tabellen zu erstellen, schlage ich vor, sie so zu speichern, 1234,2345,3456,4567, (fügen Sie am Anfang und Ende Ihres Wertes ein a hinzu und trimm alle Leerzeichen).

Dann könnte man leicht mit SQL, zum Beispiel suchen:

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

ich diese beiden Lösungen in Betracht ziehen würde anti-Muster sein und sich für Performance-Tests empfehlen würde.

Die erste Methode verwendet Funktionen, die im Flex-Tabellenpaket enthalten sind.

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) 

Die zweite Methode verwendet Funktionen, die im Textindexpaket enthalten sind.

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

leicht verbesserte Version Lösung von Abnay vorgeschlagen:

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 
Verwandte Themen