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;