《卸甲笔记》-PostgreSQL和Oracle的SQL差异分析之五:函数的差异(四)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青睐和应用。随着PostgreSQL的应用越来越广泛,Oracle向PostgreSQL数据库的数据迁移需求也越来越多。数据库之间数据迁移的时候,首先是迁移数据,然后就是SQL、存储过程、序列等程序中不同的数据库中数据的使用方式的转换。下面根据自己的理解和测试,写了一些SQL以及数据库对象转换方面的文章,不足之处,尚请多多指教。

1、NLSSORT

Oracle的NLSSORT可以改变取得字段的排序方式。默认的情况下,西文的排序是按照二进制编码的顺序排序。对于汉字按照拼音来排序。可以使用NLSSORT来改变字段的默认排序方式,从而取得不同的顺序。
以中文为例,排序可以有:
按照部首(第一顺序)、笔划(第二顺序)排序(SCHINESE_RADICAL_M)
按照笔划(第一顺序)、部首(第二顺序)排序(SCHINESE_STROKE_M)
按照拼音排序(SCHINESE_PINYIN_M)
等三种。默认是按照拼音来排序。
不使用参数的时候,自动采用Session内的默认值。

PostgreSQL中,对于西文按照二进制,对于汉字只是按照拼音来排序。同一种编码,其余的排序方式尚不支持。

Oracle NLSSORT

SQL> select * from test;

NAME
---------------
横看成岭侧成峰
远近高低各不同
不识庐山真面目
只缘身在此山中

SQL> select * from test order by name;

NAME
---------------
不识庐山真面目
横看成岭侧成峰
远近高低各不同
只缘身在此山中

SQL> select * from test order by nlssort(name);

NAME
---------------
不识庐山真面目
横看成岭侧成峰
远近高低各不同
只缘身在此山中

SQL> select * from test order by nlssort(name, 'NLS_SORT=SCHINESE_STROKE_M');

NAME
---------------
不识庐山真面目
只缘身在此山中
远近高低各不同
横看成岭侧成峰

SQL> select * from test order by nlssort(name, 'NLS_SORT=SCHINESE_PINYIN_M');

NAME
---------------
不识庐山真面目
横看成岭侧成峰
远近高低各不同
只缘身在此山中

SQL> select * from test order by nlssort(name, 'NLS_SORT=SCHINESE_RADICAL_M');

NAME
---------------
不识庐山真面目
只缘身在此山中
横看成岭侧成峰
远近高低各不同

PostgreSQL NLSSORT

postgres=# select * from test;
      name
----------------
 横看成岭侧成峰
 远近高低各不同
 不识庐山真面目
 只缘身在此山中
(4 行记录)

postgres=# select * from test order by name;
      name
----------------
 不识庐山真面目
 横看成岭侧成峰
 远近高低各不同
 只缘身在此山中
(4 行记录)

2、NLS_INITCAP/ NLS_LOWER/ NLS_UPPER

Oracle的NLS_INITCAP(x[,'NLS_SORT=y']) 、NLS_LOWER(x[,'NLS_SORT=y'])、NLS_UPPER(x[,'NLS_SORT=y']) 三个函数都有两个参数,可以根据y参数的不同,提供不同于系统默认值的结果。如果不提供这个参数,那么结果和initcap、lower和upper三个函数是一样的。
另外,Oracle的官方文档(http://docs.oracle.com/database/121/SQLRF/functions122.htm#SQLRF00676 )上,NLS_INITCAP的例子:

SELECT NLS_INITCAP('ijsland') "InitCap"
  FROM DUAL;

InitCap
-------
Ijsland

SELECT NLS_INITCAP('ijsland', 'NLS_SORT = XDutch') "InitCap"
  FROM DUAL;

InitCap
-------
IJsland

我这边做不出相同的效果。网上也没搜到。怀疑是老版的Oracle有这种做法,新版已经取消。

PostgreSQL中,对于同一种编码,没有提供多种方式排序。只有简单的Initcap, lower和upper函数。
另外,在实际使用中,这几个带NLS_的方法都几乎用不到。

Oracle NLS_INITCAP/ NLS_LOWER/ NLS_UPPER

SQL> select nls_initcap('ijslang') "test" from dual;

test
-------
Ijslang

SQL> select nls_initcap('ijslang', 'NLS_SORT=XDutch') "test" from dual;

test
-------
Ijslang

SQL> select initcap('ijslang') "test" from dual;

test
-------
Ijslang

SQL> SELECT NLS_LOWER('NOKTASINDA', 'NLS_SORT = XTurkish') "Lowercase" from dual;

Lowercase
----------
noktasinda

SQL> SELECT NLS_LOWER('NOKTASINDA') "Lowercase" from dual;

Lowercase
----------
noktasinda

SQL> SELECT LOWER('NOKTASINDA') "Lowercase" from dual;

Lowercase
----------
noktasinda

SQL> SELECT NLS_UPPER('große') "Uppercase" from dual;

Upper
-----
GRO?E

SQL> SELECT NLS_UPPER('große','NLS_SORT=XGerman') "Uppercase" from dual;

Upper
-----
GRO?E

SQL> SELECT UPPER('große') "Uppercase" from dual;

Upper
-----
GRO?E

PostgreSQL INITCAP/ LOWER/ UPPER

postgres=# select initcap('ijslang');
 initcap
---------
 Ijslang
(1 行记录)

postgres=# select LOWER('NOKTASINDA');
   lower
------------
 noktasinda
(1 行记录)

postgres=# select upper('große');
 upper
-------
 GRO?E
(1 行记录)

PostgreSQL 9.4.4 中文手册:字符串函数
http://www.postgres.cn/docs/9.4/functions-string.html
Database SQL Language Reference:
http://docs.oracle.com/database/121/SQLRF/functions122.htm#SQLRF00676
http://docs.oracle.com/database/121/SQLRF/functions123.htm#SQLRF00677
http://docs.oracle.com/database/121/SQLRF/functions125.htm#SQLRF00678
http://docs.oracle.com/database/121/SQLRF/functions124.htm#SQLRF00679

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
5月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
2月前
|
SQL 测试技术 数据处理
|
2月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
164 0
|
3月前
|
SQL Oracle 关系型数据库
|
3月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
185 3
|
3月前
|
SQL 存储 Oracle
TDengine 3.3.2.0 发布:新增 UDT 及 Oracle、SQL Server 数据接入
**TDengine 3.3.2.0 发布摘要** - 开源与企业版均强化性能,提升WebSocket、stmt模式写入与查询效率,解决死锁,增强列显示。 - taos-explorer支持geometry和varbinary类型。 - 企业版引入UDT,允许自定义数据转换。 - 新增Oracle和SQL Server数据接入。 - 数据同步优化,支持压缩,提升元数据同步速度,错误信息细化,支持表名修改。 - 扩展跨平台支持,包括麒麟、Euler、Anolis OS等。
101 0
|
4月前
|
SQL Oracle 关系型数据库
一些非常有用的Oracle SQL
一些非常有用的Oracle SQL
41 4
|
5月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之如何SQL同步数据到Oracle数据库中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
SQL Oracle 关系型数据库
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
mysql和oracle 命令行执行sql文件 数据库执行sql文件 执行sql语句
67 0
|
4月前
|
存储 SQL Oracle
oracle 存储过程导出sql语句 导出为文件
oracle 存储过程导出sql语句 导出为文件
166 0

推荐镜像

更多