我想使用SQL来处理01字符串的一部分abcd_01。对此的查询应该是什么,_变化之前的长度在哪里?也就是说,它可能是abcde_01或ab_01。基本上,我想加入_。
01
abcd_01
_
abcde_01
ab_01
这是有关SQL与各种扩展之间如何具有相似功能的示例之一,但是它们之间的差异足以使您无法保证所有数据库之间的可移植性。
使用PostgreSQL语法(未提及模式匹配)的SUBSTRING关键字是ANSI-99。为什么这花了他们这么长时间,我不知道…
您需要解决的问题是获取现有列值的子字符串,因此您需要知道数据库子字符串函数被调用了什么。
SELECT SUBSTR('abcd_01', -2) FROM DUAL
Oracle没有RIGHT函数,实际上它只是子字符串函数的包装器。但是Oracle的SUBSTR确实允许您指定一个负数,以便以相反的方式处理字符串(以开头结尾)。
两个选项-SUBSTRING和RIGHT:
SELECT SUBSTRING('abcd_01', LEN('abcd_01') - 1, 2) SELECT RIGHT('abcd_01', 2)
为了简洁起见,RIGHT是理想的选择。但是对于可移植性而言,SUBSTRING是更好的选择…
与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只有SUBSTRING:
SELECT SUBSTRING('abcd_01' FROM LENGTH('abcd_01')-1 for 2)
…但是它确实支持有限的模式匹配,您可以看到其他地方不支持这种模式。
SQLite仅支持SUBSTR:
SELECT SUBSTR('abcd_01', LENGTH('abcd_01') - 1, 2)
如果可用,请使用RIGHT,而如果需要将查询移植到其他数据库,则SUBSTR / SUBSTRING会更好,因此其他人可以清楚知道正在发生的事情,并且应该更容易找到等效的功能。