我正尝试在连字符之前提取数据,如下所示:
col_name
apple-orange
apples-oranges
apples-oranges-bananas
预期输出:
col_name
apple
apples
apples-oranges
我在Redshift中尝试过split_part
函数,但是当行中有多个连字符时,我遇到了问题
尝试了示例代码:
split_part(col_name,'-',1)
答案 0 :(得分:4)
您可以使用REGEXP_COUNT
,REGEXP_INSTR
和SUBSTRING
来实现这一目标
SQL将是
SELECT substring(col_name,1,regexp_instr(col_name,'-',1,regexp_count(col_name,'-'))-1)
使用REGEXP_COUNT
,我们可以计算出字符串中有多少个连字符。
然后使用REGEXP_INSTR
,我们可以确定最后一个连字符的位置,SUBSTRING
将为我们提供字符串的第一部分。
测试我用过的
WITH test(col_name) AS
(
SELECT 'apples-oranges' UNION
SELECT 'bananas-oranges-mangos-apples' UNION
SELECT 'apples-oranges-bananas')
SELECT col_name,
substring(col_name,1,regexp_instr(col_name,'-',1,regexp_count(col_name,'-'))-1) result
FROM test
输出为
col_name result
apples-oranges apples
apples-oranges-bananas apples-oranges
bananas-oranges-mangos-apples bananas-oranges-mangos
答案 1 :(得分:0)
我认为您将需要一个过程或函数来完成第三个示例。
示例(Oracle)
select LENGTH('apples-blah-blabla') - INSTR(REVERSE('apples-blah-blabla'),'-') from dual;
结果= 11
select substr('apples-blah-blabla', 1,11) from dual;
结果= apples-blah
在过程中这样的事情:
SQL Server
@val=select LEN('apples-blah-blabla') - CHARINDEX('-',REVERSE('apples-blah-blabla'))
from table;
select substr('apples-blah-blabla', 1,@val) from dual;
Oracle
v_val=select LENGTH('apples-blah-blabla') - INSTR(REVERSE('apples-blah-blabla'),'-')
from dual;
select substr('apples-blah-blabla', 1,v_val) from dual;