查看: 209|回復: 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
跳轉到指定樓層
1#
發表于 2020-9-16 03:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 newkid 于 2020-9-17 07:16 編輯

最先答對且答案未經編輯的puber將獲得紀念章一枚(答案不可編輯但可發新貼補充或糾正),其他會員如果提供有價值的分析、討論也可獲得紀念章一枚。

每兩周的優勝者可獲得itpub獎勵的技術圖書一本。

以往舊題索引:
http://www.3490925.live/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
2#
發表于 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
3#
 樓主| 發表于 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號
  
快速回復 返回頂部 返回列表
30岁的男人干啥赚钱快赚钱多 海南4+1彩票玩法 体彩排列七 时时彩软件如何做计划 云南快乐十分一定牛预测 幸运农场怎么玩才能稳赚 在线期货配资开户 股票分红什么时候到账 福彩快3河北 兰州外汇配资 福建体彩31选7走势图两元网