《卸甲笔记》-PostgreSQL和Oracle的SQL差异分析之五:函数的差异(四)-阿里云开发者社区

开发者社区> 瀚高大李> 正文

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

简介:
+关注继续查看

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Oracle字符乱码、数据越界访问典型Bug分析
作为乙方,在甲方客户那里验收阶段发现两个诡异Bug。以下就问题来源、问题根因、解决方案、如何避免做详细描述。
323 0
深入剖析-Oracle索引分支块的结构
每个索引分支块都只有一个lmc,这个lmc指向的分支块/叶子块中的所有索引键值列中的最大值一定小于该lmc所在分支块的所有索引键值列中的最小值; 索引分支块的行记录所对应的存储格式为“行头 + 分支块/叶子块的RDBA + col 0 + col 1”,其中col 0为索引键值列,等于该行行头.
2301 0
差异分析③
统计差异基因数目 tfit
775 0
通过定制orabbix监控分析潜在的Oracle问题
在之前的博客中分享过 简单定制Orabbix监控项   http://blog.itpub.net/23718752/viewspace-1769773/ 定制的功能在Orabbix中实现非常灵活而且轻巧,还是能够感受到一种开源风的清爽。
769 0
SQLServer · 特性分析 · SQL Server 2012的分析函数未必都理解透了(2)
title: SQLServer · 特性分析 · SQL Server 2012的分析函数未必都理解透了 author: 石沫 1. 背景 最近有用户在做一些项目,使用到SQL SERVER 2012的一些新特性,比如SQL SERVER 提供的8个非常有用的分析函数,一开始我看了相关的文
1905 0
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记24 popovers弹窗
上几话中我们详细了解了几种segue,我们也了解到了多MVC模式的几种控制器,比如导航、选项卡和分栏,除了这三种多MVC的模式之外,还有一种popover,它跟其他三种不太一样。
791 0
+关注
16
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载