괜찮을 것 없다. 당신은 단지 문자열의 n 번째 토큰을 얻을 행복 경우, 시도 :
SQL>SELECT
...> regexp_substr(
...> '2016-01-01 00:11:00|Sprout|0' -- source string
...> , '[|]?([^|]+)' -- pattern (an optional bar, followed by many non-bars, which we remember as the 1st group)
...> , 1 -- starting from begin of string: position 1
...> , 1 -- the N-th occurrence
...> , '' -- no regexp modifier
...> , 1 -- we want the only remembered group - the 1st
...> ) the_first
...>, regexp_substr(
...> '2016-01-01 00:11:00|Sprout|0' -- source string
...> , '[|]?([^|]+)' -- pattern (an optional bar, followed by many non-bars, which we remember as the 1st group)
...> , 1 -- starting from begin of string: position 1
...> , 2 -- the N-th occurrence
...> , '' -- no regexp modifier
...> , 1 -- we want the only remembered group - the 1st
...> ) the_second
...>, regexp_substr(
...> '2016-01-01 00:11:00|Sprout|0' -- source string
...> , '[|]?([^|]+)' -- pattern (an optional bar, followed by many non-bars, which we remember as the 1st group)
...> , 1 -- starting from begin of string: position 1
...> , 3 -- the N-th occurrence
...> , '' -- no regexp modifier
...> , 1 -- we want the only remembered group - the 1st
...> ) the_third
...>;
the_first |the_second |the_third
2016-01-01 00:11:00 |Sprout |0
을하지만 당신은 각각의 토큰이 새로운 라인 형성되도록하여 구분 된 문자열을 선회하려는 경우 - 두 가지 가능성 :
가
SQL>-- manual, using regexp_substr ...
...>with
...>the_array as (
...> select 1 as idx
...>union all select 2
...>union all select 3
...>union all select 4
...>union all select 5
...>union all select 6
...>union all select 7
...>union all select 8
...>union all select 9
...>union all select 10 -- increase if you might get a bigger array than one of 10 elements
...>)
...> ,concepts as (
...>select '2016-01-01 00:11:00|Sprout|0' as concepts_list
...>)
...>select * from (
...> select
...> idx
...> ,trim(
...> regexp_substr(
...> concepts_list -- source string
...> ,'[|]?([^|]+)' -- pattern (an optional bar, followed by many non-bars, which we remember as the 1st group)
...> ,1 -- starting from begin of string: position 1
...> ,idx -- the idx-th occurrence
...> ,'' -- no regexp modifier
...> ,1 -- we want the only remembered group - the 1st
...> )
...> ) as concept
...> from concepts
...> cross join the_array
...>) foo
...>where concept <> ''
...>;
idx |concept
1|2016-01-01 00:11:00
3|0
2|Sprout
select succeeded; 3 rows fetched
SQL>-- using the strings_package on:
...>-- https://github.com/vertica/Vertica-Extension-Packages/blob/master/strings_package/src/StringTokenizerDelim.cpp
...>WITH csvtab(id,delimstring) AS (
...> SELECT 1,'2016-01-01 00:11:00|Sprout|0'
...>UNION ALL SELECT 2,'2016-01-02 00:11:00|Trout|1'
...>UNION ALL SELECT 3,'2016-01-03 00:11:00|Salmon|2'
...>UNION ALL SELECT 4,'2016-01-04 00:11:00|Bass|3'
...>)
...>SELECT id, words
...>FROM (
...> SELECT id, v_txtindex.StringTokenizerDelim(delimstring,'|') OVER (PARTITION by id) FROM csvtab
...>) a
...>ORDER BY 1;
id |words
1|2016-01-01 00:11:00
1|Sprout
1|0
2|2016-01-02 00:11:00
2|Trout
2|1
3|2016-01-03 00:11:00
3|Salmon
3|2
4|2016-01-04 00:11:00
4|Bass
4|3
select succeeded; 12 rows fetched
select 문에 3 개의 항목이 없어도 별도의 열을 얻을 수 있는지 궁금합니다. 파이썬에 익숙하다면, string.split ('|')의 효과를 원할 것입니다. 이것이 SQL에서 가능하지 않다면 완전히 괜찮습니다. 당신의 첫번째 예제는 vertica 함수 SPLIT_PART (string, delimiter, occurence)를 사용하여가는 길입니다. – mangodreamz