在我的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提供了另一种功能,它也有帮助。其余的可以用例如在。 真正重要的部分是获取子串。
答案 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)
使用为此专门构建的split_part
:
split_part(string, '_', 1)
引用API docs:
SPLIT_PART()
函数在指定的分隔符上分割字符串,并返回第n个子字符串。
这3个参数是要分割的字符串,定界符以及要返回的部分/子字符串编号(从1开始)。
因此,如果您有一个名为string
的字段,其中包含诸如AB_XXX
之类的东西,并且您想获取_
之前的所有内容,那么您可以按此拆分并获取第一部分/子字符串:split_part(string, '_', 1)
。