一尘不染

查询子串形成

sql

我想使用SQL来处理01字符串的一部分abcd_01。对此的查询应该是什么,_变化之前的长度在哪里?也就是说,它可能是abcde_01ab_01。基本上,我想加入_


阅读 125

收藏
2021-03-10

共1个答案

一尘不染

这是有关SQL与各种扩展之间如何具有相似功能的示例之一,但是它们之间的差异足以使您无法保证所有数据库之间的可移植性。

使用PostgreSQL语法(未提及模式匹配)SUBSTRING关键字是ANSI-99。为什么这花了他们这么长时间,我不知道…

您需要解决的问题是获取现有列值的子字符串,因此您需要知道数据库子字符串函数被调用了什么。

甲骨文


SELECT SUBSTR('abcd_01', -2) FROM DUAL

Oracle没有RIGHT函数,实际上它只是子字符串函数的包装器。但是Oracle的SUBSTR确实允许您指定一个负数,以便以相反的方式处理字符串(以开头结尾)。

SQL服务器


两个选项-SUBSTRINGRIGHT

SELECT SUBSTRING('abcd_01', LEN('abcd_01') - 1, 2)
SELECT RIGHT('abcd_01', 2)

为了简洁起见,RIGHT是理想的选择。但是对于可移植性而言,SUBSTRING是更好的选择…

的MySQL


与SQL Server一样,三个选项-SUBSTRSUBSTRINGRIGHT

SELECT SUBSTR('abcd_01', LENGTH('abcd_01') - 1, 2)
SELECT SUBSTRING('abcd_01', LENGTH('abcd_01') - 1, 2)
SELECT RIGHT('abcd_01', 2)

PostgreSQL的


PostgreSQL只有SUBSTRING

 SELECT SUBSTRING('abcd_01' FROM LENGTH('abcd_01')-1 for 2)

…但是它确实支持有限的模式匹配,您可以看到其他地方不支持这种模式。

SQLite的


SQLite仅支持SUBSTR

SELECT SUBSTR('abcd_01', LENGTH('abcd_01') - 1, 2)

结论


如果可用,请使用RIGHT,而如果需要将查询移植到其他数据库,则SUBSTR /
SUBSTRING会更好,因此其他人可以清楚知道正在发生的事情,并且应该更容易找到等效的功能。

2021-03-10