在特定字符SQL-Standard处拆分字符串

时间:2015-04-27 12:32:46

标签: string postgresql string-split sql-standards

在我的SQL语句中,我必须从字符' _'中的字符串中提取子字符串。字符串可以是例如A_XXX' ' AB_XXX' ' ABC_XXXX',因此提取的子字符串应该类似于' A' ' AB' ' ABC'

在Oracle中,使用substr()和instr()函数很容易:

select substr('AB_XXX', 1, instr('AB_XXX', '_')-1) as substring
from dual;

结果将是:

SUBSTRING
------------------------
AB

我需要此查询来检查特定子字符串是否在字符串数组中。

整个查询看起来像:

select 'AB_XXX' from dual
where (instr('ABC_AB_A', substr('AB_XXX', 1, instr('AB_XXX', '_')-1))>0);

有没有办法在SQL-Standard中编写它?

提前感谢您的帮助。

编辑:

如果PostgreSQL提供了另一种功能,它也有帮助。其余的可以用例如在。 真正重要的部分是获取子串。

3 个答案:

答案 0 :(得分:16)

你的第二个例子有点混乱,因为你混合'ABC_AB_A''AB_XXX'不确定这是不是错字。

但如果您只想在第一个_之前找到所有字符,那么以下内容适用于Postgres:

left(col, strpos(col, '_') - 1)

或使用正则表达式:

substring(col from '([A-Z]+)(_{1})')

您也可以在Oracle中使用正则表达式:

regexp_substr(col, '([A-Z]+)(_{1})', 1, 1, 'i', 1)

Postgres'substring函数始终返回正则表达式的第一个捕获组,而在Oracle中,您可以指定所需的组:这是regexp_substr()函数的最后一个参数。

SQLFiddle for Oracle:http://sqlfiddle.com/#!4/b138c/1
Postfres的SQLFiddle:http://sqlfiddle.com/#!15/4b2bb/1

答案 1 :(得分:1)

标准SQL字符串函数描述于: SQL String Functions and Operators

有一个substring函数可以直接提取内容,而不必嵌套函数调用。它在Pattern matching中详细说明为:

  

子串函数有三个参数, substring(字符串来自   escape-character的模式,提供了一个子串的提取   匹配SQL正则表达式模式。与SIMILAR TO一样,   指定的模式必须匹配整个数据字符串,否则   函数失败并返回null。表示模式的一部分   应该在成功时返回,模式必须包含两个   出现转义字符后跟双引号(“)。   与这些标记之间的图案部分匹配的文本是   返回。

在你的情况下:

select substring('AB_XX' from '#"%#"#_%' for '#');

结果:

 substring 
-----------
 AB
(1 row)

语法有点奇怪,特别是因为_是单个字符的通配符所以必须引用它,但它是SQL标准。

对于更多人使用的语法,请考虑regexp_replace()或使用POSIX正则表达式的类似函数。

答案 2 :(得分:0)

tl; dr

使用为此专门构建的split_part

split_part(string, '_', 1)

说明

引用API docs

  

SPLIT_PART()函数在指定的分隔符上分割字符串,并返回第n个子字符串。

这3个参数是要分割的字符串,定界符以及要返回的部分/子字符串编号(从1开始)。

因此,如果您有一个名为string的字段,其中包含诸如AB_XXX之类的东西,并且您想获取_之前的所有内容,那么您可以按此拆分并获取第一部分/子字符串:split_part(string, '_', 1)

相关问题