sql - 查询子串形成

标签 sql database string

我想使用 SQL 获取字符串 abcd_0101 部分。在 _ 之前的长度不同的情况下,应该查询什么?也就是说,它可能是abcde_01ab_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服务器


两个选项 - SUBSTRING , 和 RIGHT :

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/

相关文章:

sql - 用计算表达式更新 sql 临时表列

mysql - mysql 查询中的非法混合排序错误

mysql - 从两个不同的表中选择数据同时覆盖不同的记录时获取重复值

php - 查询数据库时出错-PHP,SQL和PHPMyAdmin

php - preg_replace() 和\n 在一个字符串中

我可以通过最少的复制从 Unbounded_String 获取 chars_ptr 吗?

mysql 测验排行榜按分数、花费时间过滤

c# - 如何将 PropertyBag 类存储到数据库中

php - 有没有办法在 SQL 全文搜索中比较特定字段?

java - 在Java中给定一个字符串,只需取前X个字母