查看: 203|回复: 2

[每日一题] PL/SQL Challenge 每日一题:2020-9-10 COLLATE(12.2)

[复制链接]
论坛徽章:
527
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2020-9-16 03:18 | 显示全部楼层 |阅读模式
本帖最后由 newkid 于 2020-9-17 07:16 编辑

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
http://www.itpub.net/forum.php?m ... =typeid&typeid=1808

原始出处:
https://devgym.oracle.com/

作者:Kim Berg Hansen

运行环境:SQLPLUS, SERVEROUTPUT已打开, 最低版本要求:12.2
注:本题给出答案时候要求给予简要说明才能得到奖品

注意:除了通常的题目设定之外,本题还要求将数据库参数MAX_STRING_SIZE设置为EXTENDED:

select * from v$parameter where name = 'max_string_size';

NAME                 VALUE               
-------------------- --------------------
max_string_size      EXTENDED            

我有一张表,还有一个视图,里面有些文本列:

create table qz_some_text (
   id    integer  primary key
, txt1  varchar2(100)
, txt2  varchar2(100) collate danish
)
default collation german;

create or replace view qz_view_text as
select
   id
, txt1
, txt2
, txt1 collate danish  as txt3
, txt2 collate german  as txt4
, nls_upper(txt1, 'nls_sort = danish') as txt5
, nls_upper(txt1, 'nls_sort = danish') collate danish as txt6
from qz_some_text;

insert into qz_some_text values (42, 'Zweiundvierzig', 'Toogfyrre');

commit;

哪些选项会返回这个需求的输出中的collation是DANISH?

COLLATION_NAME      
--------------------
DANISH

(A)
select collation(txt1) as collation_name from qz_some_text;

(B)
select collation(txt2) as collation_name from qz_some_text;

(C)
select collation(txt1 collate danish) as collation_name
from qz_some_text;

(D)
select collation(txt2 collate german) as collation_name
from qz_some_text;

(E)
select collation(txt1) as collation_name from qz_view_text;

(F)
select collation(txt2) as collation_name from qz_view_text;

(G)
select collation(txt3) as collation_name from qz_view_text;

(H)
select collation(txt4) as collation_name from qz_view_text;


(I)
select collation(txt5) as collation_name from qz_view_text;

(J)
select collation(txt6) as collation_name from qz_view_text;

论坛徽章:
18
山治
日期:2017-01-11 16:13:26妮可·罗宾
日期:2020-09-01 08:52:07秀才
日期:2018-01-02 10:32:00技术图书徽章
日期:2017-08-23 14:17:00技术图书徽章
日期:2017-08-23 14:17:00秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
发表于 2020-9-16 09:50 | 显示全部楼层
答案 BCFGHJ

A)  错误,输出为GERMAN,建表的时候txt1没有指定collate,所以是表的collate GERMAN

B)  正确,输出为DANISH,建表的时候txt1指定collate 为DANISH,未沿用表的collate

C)  正确,输出为DANISH,通过collation函数将txt1的collate 改为DANISH

D)  错误,输出为GERMAN,通过collation函数将txt2的collate 改为GERMAN

E)  错误,输出为GERMAN,collation函数未指定collate,所以不变

F) 正确,输出为DANISH,collation函数未指定collate,所以不变

G)  正确,输出为DANISH,txt3是将txt1的collate转为DANISH

H) 正确,输出为DANISH,与G代码一模一样,感觉这个地方应该是txt4

I)  错误,输出为GERMAN,并未指定collate,故同txt1的collate

J) 正确,输出为DANISH,有指定collate danish,故输出为DANISH

使用道具 举报

回复
论坛徽章:
527
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2020-9-17 07:16 | 显示全部楼层
答案BCFGJ, 2楼得奖。由于我的笔误使得2楼选择了H, 特此致歉,现已改正。

A:
对于表列TXT1,我们在创建时并没有指定拼写方式(collation),所以它得到了表的默认拼写方式,我们指定为german(德语),所以这里输出的是german。

B:
对于表列TXT2,我们在创建的时候明确指定了DANISH作为拼写方式,所以这里输出的是DANISH。

C:
任何文本表达式,我们都可以用 COLLATE 操作符指定一种拼写方式,结果表达式就会有这种拼写方式,所以即使表中的 TXT1 有 GERMAN 拼写方式,这里我们强制将表达式改为 DANISH 拼写方式,就会输出DANISH。

D:
同样的,即使表中的TXT2有DANISH拼写,这里我们也将表达式强制为GERMAN拼写,这将会被输出。

E:
在视图(或内联视图)中使用一列并不能改变它的拼写方式----我们得到与A选项一样的错误输出。

F:
在视图(或内联视图)中使用一列并不改变它的拼写方式----我们得到与B选项一样的正确输出。

G:
视图中的TXT3会强制表达式采用DANISH拼写方式,就像C选项一样。而这种拼写方式当然也是这个查询的结果。

H:
视图中的TXT4将表达式强行改为GERMAN,就像在D选项中一样。当然,这种拼写方式也是这个查询的结果。

I:
TXT5使用了一个NLS函数(在本例中是NLS_UPPER),根据特定的拼写方式执行操作(在本例中是将文本转换为大写字母),但结果并没有自动地进行相同的拼写。即使我们已经使用了DANISH的拼写规则来确定哪些字符是大写和小写,但这并不意味着我们一定要让表达式使用DANISH的拼写方式来进行排序或比较。TXT5表达式继承了表中TXT1列的拼写方式,而TXT1列是德语,所以我们得到了错误的输出。

J:
但是在TXT6表达式,我们在NLS_UPPER调用的结果上明确地使用了 COLLATE DANISH,这就迫使表达式使用了DANISH拼写方式,从而得到了正确的输出。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表