Sql 在最后一个连字符之前提取数据的红移

Sql 在最后一个连字符之前提取数据的红移,sql,amazon-redshift,Sql,Amazon Redshift,我试图在连字符之前提取数据,如下所示: col_name apple-orange apples-oranges apples-oranges-bananas 预期产出: col_name apple apples apples-oranges 我尝试在红移中使用split_part函数,但当行有多个连字符时出现问题 已尝试的示例代码: split_part(col_name,'-',1) 您可以使用REGEXP\u COUNT、REGEXP\u INSTR和SUBSTRING来实现这一点

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

col_name
apple-orange
apples-oranges
apples-oranges-bananas
预期产出:

col_name
apple
apples
apples-oranges
我尝试在红移中使用split_part函数,但当行有多个连字符时出现问题

已尝试的示例代码:

split_part(col_name,'-',1)
您可以使用REGEXP\u COUNT、REGEXP\u INSTR和SUBSTRING来实现这一点

SQL将是

SELECT substring(col_name,1,regexp_instr(col_name,'-',1,regexp_count(col_name,'-'))-1)
使用REGEXP\u COUNT可以计算字符串中的连字符数。 然后使用REGEXP_INSTR,我们可以确定最后一个连字符的位置,子字符串将给出字符串的第一部分

为了测试我使用的

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


您可以使用REGEXP\u COUNT、REGEXP\u INSTR和SUBSTRING来实现这一点

SQL将是

SELECT substring(col_name,1,regexp_instr(col_name,'-',1,regexp_count(col_name,'-'))-1)
使用REGEXP\u COUNT可以计算字符串中的连字符数。 然后使用REGEXP_INSTR,我们可以确定最后一个连字符的位置,子字符串将给出字符串的第一部分

为了测试我使用的

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



我认为您需要一个过程或函数来完成第三个示例

示例Oracle

结果=11

结果=苹果等等

在一个过程中类似这样的事情:

SQL Server

神谕


我认为您需要一个过程或函数来完成第三个示例

示例Oracle

结果=11

结果=苹果等等

在一个过程中类似这样的事情:

SQL Server

神谕


可以在没有函数或过程的红移中完成,请参见我的答案,OP已经很好地完成了红移。类似的东西也可以在其他平台上使用,尽管我知道OP专门询问红移。可以在红移中完成,不需要函数或过程,请参见我的答案,OP已经完成了红移。类似的东西应该也适用于其他平台,尽管我知道OP特别询问红移。
v_val=select LENGTH('apples-blah-blabla') - INSTR(REVERSE('apples-blah-blabla'),'-') 
      from dual;

select substr('apples-blah-blabla', 1,v_val) from dual;