Redshift在最后一个连字符之前提取数据

时间:2019-08-08 19:41:59

标签: sql amazon-redshift

我正尝试在连字符之前提取数据,如下所示:

col_name
apple-orange
apples-oranges
apples-oranges-bananas

预期输出:

col_name
apple
apples
apples-oranges

我在Redshift中尝试过split_part函数,但是当行中有多个连字符时,我遇到了问题

尝试了示例代码:

split_part(col_name,'-',1)

2 个答案:

答案 0 :(得分:4)

您可以使用REGEXP_COUNTREGEXP_INSTRSUBSTRING来实现这一目标

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;