اوراکل در نسخه 23ai قابلیت جدیدی را برای دستور CASE در محیط PL/SQL ارائه کرده است که در این متن با آن آشنا خواهیم شد. در ابتدا شکل ساده دستور CASE در PL/SQL را با یک مثال مرور می کنیم:
declare
VALUE number := 3;
text varchar2(50);
begin
text := case VALUE
when 1 then
'ONE'
when 2 then
'TWO'
when 3 then
'THREE'
else
'NOT ONE, TWO NOR THREE'
end;
dbms_output.put_line(text);
end;
/
THREE
در این قطعه کد صرفا از عملگر مساوی استفاده شده است و برای استفاده از عملگرهای دیگر نظیر “>”، “<“، BETWEEN و IN باید از فرمت زیر که Searched CASE syntax نامیده می شود، استفاده کنیم:
declare
VALUE number := 3;
text varchar2(50);
begin
text := case
when VALUE < 0 OR VALUE > 5 then
'OUT OF RANGE'
when VALUE in (1, 2) then
'ONE OR TWO'
when VALUE between 0 and 3 then
'BETWEEN 0 AND 3 BUT NOT 1 NOR 2'
else
'OTHER'
end;
dbms_output.put_line(text);
end;
/
BETWEEN 0 AND 3 BUT NOT 1 NOR 2
همچنین می توان این کد را به فرمت زیر هم نوشت:
declare
VALUE number := 3;
text varchar2(50);
begin
case
when VALUE < 0 OR VALUE > 5 then
text :='OUT OF RANGE';
when VALUE in (1, 2) then
text :='ONE OR TWO';
when VALUE between 0 and 3 then
text :='BETWEEN 0 AND 3 BUT NOT 1 NOR 2';
else
text :='OTHER';
end case;
dbms_output.put_line(text);
end;
/
BETWEEN 0 AND 3 BUT NOT 1 NOR 2
در نسخه 23ai، با استفاده از قابلیت dangling predicate نیازی به تکرار متغیر VALUE نخواهیم داشت(در قطعه کد فوق) و این متغیر صرفا یکبار در کنار دستور case نوشته می شود.
declare
VALUE number := 3;
text varchar2(50);
begin
text := case VALUE
when < 0, > 5 then
'OUT OF RANGE'
when in (1, 2) then
'ONE OR TWO'
when between 0 and 3 then
'BETWEEN 0 AND 3 BUT NOT 1 NOR 2'
else
'OTHER'
end;
dbms_output.put_line(text);
end;
/
BETWEEN 0 AND 3 BUT NOT 1 NOR 2
همچنین می توان این کد را به فرمت زیر هم نوشت:
declare
VALUE number := 3;
text varchar2(50);
begin
case VALUE
when < 0, > 5 then
text :='OUT OF RANGE';
when in (1, 2) then
text :='ONE OR TWO';
when between 0 and 3 then
text :='BETWEEN 0 AND 3 BUT NOT 1 NOR 2';
else
text :='OTHER';
end case;
dbms_output.put_line(text);
end;
/
BETWEEN 0 AND 3 BUT NOT 1 NOR 2
این بهبود جزیی در SQL CASE قابل استفاده نیست:
SQL> create table tb (GRD number); Table created. SQL> insert into tb values (0), (1), (2), (3), (4), (5), (6), (7) ; 8 rows created. SQL> commit;
اجرای دستور case به روش زیر قابل انجام است:
SQL> select GRD,
case
when GRD < 0 OR GRD > 5 then
'OUT OF RANGE'
when GRD in (1, 2) then
'ONE OR TWO'
when GRD between 0 and 3 then
'BETWEEN 0 AND 3 BUT NOT 1 NOR 2'
else
'OTHER'
end GRD2
from tb;
GRD GRD2
---------- -------------------------------
0 BETWEEN 0 AND 3 BUT NOT 1 NOR 2
1 ONE OR TWO
2 ONE OR TWO
3 BETWEEN 0 AND 3 BUT NOT 1 NOR 2
4 OTHER
5 OTHER
6 OUT OF RANGE
7 OUT OF RANGE
8 rows selected.
اما نوشتن این کوئری به روش dangling predicate با خطا مواجه خواهد شد:
SQL> select GRD,case GRD
when < 0 OR > 5 then
'OUT OF RANGE'
when in (1, 2) then
'ONE OR TWO'
when between 0 and 3 then
'BETWEEN 0 AND 3 BUT NOT 1 NOR 2'
else
'OTHER'
end GRD2
from tb;
'ORA-00936: missing expression'