我想使用 SQL 获取字符串 abcd_01
的 01
部分。在 _
之前的长度不同的情况下,应该查询什么?也就是说,它可能是abcde_01
或ab_01
。基本上,我想要 _
之后的部分。
最佳答案
这是 SQL 和各种扩展之间如何具有相似功能的示例之一,但它们之间的差异足以让您无法保证所有数据库之间的可移植性。
SUBSTRING keyword, using PostgreSQL syntax (no mention of pattern matching) is ANSI-99 .为什么他们花了这么长时间,我不知道。
您的关键是获取现有列值的子字符串,因此您需要知道调用的数据库子字符串函数是什么。
甲骨文
SELECT SUBSTR('abcd_01', -2) FROM DUAL
Oracle 没有 RIGHT 函数,with 实际上只是子字符串函数的包装器。但是Oracle's SUBSTR确实允许您指定一个负数以便反向处理字符串(结束到开始)。
SQL服务器
SELECT SUBSTRING('abcd_01', LEN('abcd_01') - 1, 2)
SELECT RIGHT('abcd_01', 2)
为简洁起见,RIGHT 是理想的。但为了便携性,SUBSTRING 是更好的选择...
MySQL
像 SQL Server,三个选项 - SUBSTR , SUBSTRING , 和 RIGHT :
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 会更好,这样其他人就可以清楚地了解正在发生的事情,并且应该更容易找到等效的功能。
关于sql - 查询子串形成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220584/