oracle 每日一題 case表示式

2021-07-27 01:38:19 字數 4179 閱讀 4147

原始出處:

執行環境:sqlplus, serveroutput已開啟

我們正在建立乙個應用,使用者可以選擇他們的考題難度。他們可以選擇某種特定難度,也可以指定乙個範圍。我們用整數值來代表這些選項:

1 beginner only

2 beginner -> intermediate

3 intermediate

4 intermediate -> advanced

5 advanced

6 any

我們需要在select語句中引用這些範圍。所以我執行了下列語句:

create or replace package plch_pkg

isc_beginner       constant integer := 1;

c_intermediate   constant integer := 2;

c_advanced       constant integer := 3;

end;

/哪些選項在執行這個**塊之後:

begin

dbms_output.put_line (plch_difficulty_where_clause (6));

end;

/會導致下列文字被顯示:

difficulty_number in (1,2,3)

(a) 

create or replace function plch_difficulty_where_clause (

difficulty_range_in   in integer)

return varchar2

isbegin

return    'difficulty_number in ('

|| c

asedifficulty_range_in

when 1

then

plch_pkg.c_beginner

when 2

then

plch_pkg.c_beginner || ',' || plch_pkg.c_intermediate

when 3

then

plch_pkg.c_intermediate

when 4

then

plch_pkg.c_intermediate || ',' || plch_pkg.c_advanced

when 5

then

plch_pkg.c_advanced

when 6

then

plch_pkg.c_beginner

|| ','

|| plch_pkg.c_intermediate

|| ','

|| plch_pkg.c_advanced

end|| ')';

end;

/(b) 

create or replace function plch_difficulty_where_clause (

difficulty_range_in   in integer)

return varchar2

isbegin

return    'difficulty_number in ('

|| case difficulty_range_in

when 1

then

to_char (plch_pkg.c_beginner)

when 2

then

plch_pkg.c_beginner || ',' || plch_pkg.c_intermediate

when 3

then

plch_pkg.c_intermediate

when 4

then

plch_pkg.c_intermediate || ',' || plch_pkg.c_advanced

when 5

then

plch_pkg.c_advanced

when 6

then

plch_pkg.c_beginner

|| ','

|| plch_pkg.c_intermediate

|| ','

|| plch_pkg.c_advanced

end|| ')';

end;

/(c) 

create or replace function plch_difficulty_where_clause (

difficulty_range_in   in integer)

return varchar2

isbegin

return    'difficulty_number in ('

|| case difficulty_range_in

when 1

then

to_char (plch_pkg.c_beginner)

when 2

then

plch_pkg.c_beginner || ',' || plch_pkg.c_intermediate

when 3

then

to_char (plch_pkg.c_intermediate)

when 4

then

plch_pkg.c_intermediate || ',' || plch_pkg.c_advanced

when 5

then

to_char (plch_pkg.c_advanced)

when 6

then

plch_pkg.c_beginner

|| ','

|| plch_pkg.c_intermediate

|| ','

|| plch_pkg.c_advanced

end|| ')';

end;

/(d) 

create or replace package plch_pkg

isc_beginner       constant varchar2 (1) := 1;

c_intermediate   constant varchar2 (1) := 2;

c_advanced       constant varchar2 (1) := 3;

end;

/create or replace function plch_difficulty_where_clause (

difficulty_range_in   in integer)

return varchar2

isbegin

return    'difficulty_number in ('

|| case difficulty_range_in

when 1

then

plch_pkg.c_beginner

when 2

then

plch_pkg.c_beginner || ',' || plch_pkg.c_intermediate

when 3

then

plch_pkg.c_intermediate

when 4

then

plch_pkg.c_intermediate || ',' || plch_pkg.c_advanced

when 5

then

plch_pkg.c_advanced

when 6

then

plch_pkg.c_beginner

|| ','

|| plch_pkg.c_intermediate

|| ','

|| plch_pkg.c_advanced

end|| ')';

end;/

ab: 這個選項會報 ora-06502 錯誤。

問題在於有些表示式(不帶拼接的那些)返回乙個整數,有些返回乙個字串(那些帶拼接的,它們依賴於隱式轉換)。

如果when子句中有任何乙個是整數,那麼pl/sql就會要求每個都是整數,因此拼接會導致錯誤——它們無法被轉換成整數。

c: 現在,when子句中每乙個整數都被顯式轉換成字串,所以case表示式可以完成而不出錯。

d: 現在,包把所有三個常量宣告為字串,因此case中的所有表示式都是相同的型別。

每日一題 反轉鍊錶

這道是牛客的題,給了鍊錶然後返回鍊錶的新表頭。拿到這道題首先肯定想到的是暴力求解,從表頭開始遍歷到尾,用尾元素作為新錶的表頭,然後遍歷尾元素的上乙個元素,鏈到新錶的最後然後不斷重複直到鍊錶的表頭鏈到新錶的尾巴 這樣有乙個很大的問題就是複雜度太高了,時間複雜度是o n n 這個時候我想到了肯定有簡單的...

每日一題 1

題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...

每日一題2018 3 21

leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...