oracle資料庫if
A. oracle sql 當中的IF函數是什麼
selectA,casewhenA=0thenBwhenA=1thenCendfromtable
或者
selectA,decode(A,0,B,1,C)fromtable
B. oracle怎麼寫IF語句
oracle的if語句採用decode函數。
DECODE(value,if1,then1,if2,then2,if3,then3,...,else)
表示如果value 等於if1時,DECODE函數的結果返回then1,...,如果不等於任何一個if值,則返回else
示例:
比如,有個if語句如下
if(a==1){//如果a等於1,返回2,否則返回3
return2;
}else{
return3;
}
翻譯成DECODE如下
DECODE(a,1,2,3)
C. oracle if 後可以給多個條件不
這樣的語法肯定是可以的。關鍵是你的or,是不是你的邏輯分析出了問題?你的這個判斷,只有一種情況,會不執行then後邊的情況,就是a = 1 同時 b = 2同時 c = 3的時候,否則,都執行then後邊的語句。是不是你的邏輯出問題,出了a = 1 and b = 2 and c = 3,那麼其他時候,都符合你這個判斷。
你看看你所說的條件不成立的數據是什麼,如果有困惑,可以把你指的這條數據貼出來。
D. 在oracle sql語句里有沒有if...else...的用法,請各位大俠給個例子看看,灰常感謝!!
oracle 中if ..else 可以再pl/sql 中使用,
如果是要在SQL語句中達到這種效果可以用case when ... then ...else ..end;
mysql資料庫中CASE WHEN語句。
case when語句,用於計算條件列表並返回多個可能結果表達式之一。
CASE 具有兩種格式:
簡單 CASE 函數將某個表達式與一組簡單表達式進行比較以確定結果。
CASE 搜索函數計算一組布爾表達式以確定結果。
兩種格式都支持可選的 ELSE 參數。
語法
簡單 CASE 函數:
復制代碼 代碼如下:
CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END
CASE 搜索函數:
復制代碼 代碼如下:
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END
參數
input_expression
是使用簡單 CASE 格式時所計算的表達式。Input_expression 是任何有效的 Microsoft? SQL Server? 表達式。
WHEN when_expression
使用簡單 CASE 格式時 input_expression 所比較的簡單表達式。When_expression 是任意有效的 SQL
Server 表達式。Input_expression 和每個 when_expression 的數據類型必須相同,或者是隱性轉換。
佔位符,表明可以使用多個 WHEN when_expression THEN result_expression 子句或 WHEN Boolean_expression THEN result_expression 子句。
THEN result_expression
當 input_expression = when_expression 取值為 TRUE,或者 Boolean_expression 取值為 TRUE 時返回的表達式。
result expression 是任意有效的 SQL Server 表達式。
ELSE else_result_expression
當比較運算取值不為 TRUE 時返回的表達式。如果省略此參數並且比較運算取值不為 TRUE,CASE 將返回 NULL
值。Else_result_expression 是任意有效的 SQL Server 表達式。Else_result_expression
和所有 result_expression 的數據類型必須相同,或者必須是隱性轉換。
WHEN Boolean_expression
使用 CASE 搜索格式時所計算的布爾表達式。Boolean_expression 是任意有效的布爾表達式。
結果類型
從 result_expressions 和可選 else_result_expression 的類型集合中返回最高的優先規則類型。有關更多信息,請參見數據類型的優先順序。
結果值
簡單 CASE 函數:
計算 input_expression,然後按指定順序對每個 WHEN 子句的 input_expression = when_expression 進行計算。
返回第一個取值為 TRUE 的 (input_expression = when_expression) 的 result_expression。
如果沒有取值為 TRUE 的 input_expression = when_expression,則當指定 ELSE 子句時 SQL Server 將返回 else_result_expression;若沒有指定 ELSE 子句,則返回 NULL 值。
CASE 搜索函數:
按指定順序為每個 WHEN 子句的 Boolean_expression 求值。
返回第一個取值為 TRUE 的 Boolean_expression 的 result_expression。
如果沒有取值為 TRUE 的 Boolean_expression,則當指定 ELSE 子句時 SQL Server 將返回 else_result_expression;若沒有指定 ELSE 子句,則返回 NULL 值。
下面分享一些mysql case when語句的例子。
A. 使用帶有簡單 CASE 函數的 SELECT 語句
在 SELECT 語句中,簡單 CASE 函數僅檢查是否相等,而不進行其它比較。
例子,使用 CASE 函數更改圖書分類顯示。
復制代碼 代碼如下:
USE pubs
GO
SELECT Category =
CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO
注釋,後來我試了一下不讓用category=。
我使用的代碼為:
復制代碼 代碼如下:
SELECT
case gender
WHEN 1 THEN 'NAN'
WHEN 0 THEN 'NV'
end as gender
FROM
t_swidy_day_nutrient
結果集:
Category Shortened Title Price
------------------- ------------------------- --------------------------
Business You Can Combat Computer S 2.99
Business Cooking with Computers: S 11.95
Business The Busy Executive's Data 19.99
Business Straight Talk About Compu 19.99
avg
==========================
13.73
Category Shortened Title Price
------------------- ------------------------- --------------------------
Modern Cooking The Gourmet Microwave 2.99
Modern Cooking Silicon Valley Gastronomi 19.99
avg
==========================
11.49
Category Shortened Title Price
------------------- ------------------------- --------------------------
Popular Computing Secrets of Silicon Valley 20.00
Popular Computing But Is It User Friendly? 22.95
avg
==========================
21.48
Category Shortened Title Price
------------------- ------------------------- --------------------------
Psychology Life Without Fear 7.00
Psychology Emotional Security: A New 7.99
Psychology Is Anger the Enemy? 10.95
Psychology Prolonged Data Deprivatio 19.99
Psychology Computer Phobic AND Non-P 21.59
avg
==========================
13.50
Category Shortened Title Price
------------------- ------------------------- --------------------------
Traditional Cooking Fifty Years in Buckingham 11.95
Traditional Cooking Sushi, Anyone? 14.99
Traditional Cooking Onions, Leeks, and Garlic 20.95
avg
==========================
15.96
(21 row(s) affected)
B. 使用帶有簡單 CASE 函數和 CASE 搜索函數的
SELECT 語句
在 SELECT 語句中,CASE 搜索函數允許根據比較值在結果集內對值進行替換。
例子:根據圖書的價格範圍將價格(money 列)顯示為文本注釋。
復制代碼 代碼如下:
USE pubs
GO
SELECT 'Price Category' =
CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title'
WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO
結果集:
Price Category Shortened Title
--------------------- --------------------
Not yet priced Net Etiquette
Not yet priced The Psychology of Co
Very Reasonable Title The Gourmet Microwav
Very Reasonable Title You Can Combat Compu
Very Reasonable Title Life Without Fear
Very Reasonable Title Emotional Security:
Coffee Table Title Is Anger the Enemy?
Coffee Table Title Cooking with Compute
Coffee Table Title Fifty Years in Bucki
Coffee Table Title Sushi, Anyone?
Coffee Table Title Prolonged Data Depri
Coffee Table Title Silicon Valley Gastr
Coffee Table Title Straight Talk About
Coffee Table Title The Busy Executive's
Expensive book! Secrets of Silicon V
Expensive book! Onions, Leeks, and G
Expensive book! Computer Phobic And
Expensive book! But Is It User Frien
(18 row(s) affected)
C. 使用帶有 SUBSTRING 和 SELECT 的 CASE 函數
例子,使用 CASE 和 THEN 生成一個有關作者、圖書標識號和每個作者所著圖書類型的列表。
首先,來看下 CASE 的語法。在一般的 SELECT 中,其語法如下:
復制代碼 代碼如下:
SELECT <myColumnSpec> =
CASE
WHEN <A> THEN <somethingA>
WHEN <B> THEN <somethingB>
ELSE <somethingE>
END
以上代碼,需要用具體的參數代替尖括弧中的內容。
甚至還可以組合這些選項,添加一個 ORDER BY 子句,例如:
復制代碼 代碼如下:
USE pubs
GO
SELECT
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END AS Range,
Title
FROM titles
GROUP BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
ORDER BY
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END,
Title
GO
除了選擇自定義欄位之外,在很多情況下 CASE 都非常有用。
稍加深入,還可以得到以前認為不可能得到的分組排序結果集。
使用CASE WHEN進行字元串替換處理
在SELECT查詢中使用CASE WHEN
復制代碼 代碼如下:
/*
mysql> SELECT Name, RatingID AS Rating,
-> CASE RatingID
-> WHEN 'R' THEN 'Under 17 requires an alt.'
-> WHEN 'X' THEN 'No one 17 and under.'
-> WHEN 'NR' THEN 'Use discretion when renting.'
-> ELSE 'OK to rent to minors.'
-> END AS Policy
-> FROM DVDs
-> ORDER BY Name;
+-----------+--------+------------------------------+
| Name | Rating | Policy |
+-----------+--------+------------------------------+
| Africa | PG | OK to rent to minors. |
| Amadeus | PG | OK to rent to minors. |
| Christmas | NR | Use discretion when renting. |
| Doc | G | OK to rent to minors. |
| Falcon | NR | Use discretion when renting. |
| Mash | R | Under 17 requires an alt. |
| Show | NR | Use discretion when renting. |
| View | NR | Use discretion when renting. |
+-----------+--------+------------------------------+
8 rows in set (0.01 sec)
*/
Drop table DVDs;
CREATE TABLE DVDs (
ID SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(60) NOT NULL,
NumDisks TINYINT NOT NULL DEFAULT 1,
RatingID VARCHAR(4) NOT NULL,
StatID CHAR(3) NOT NULL
)
ENGINE=INNODB;
INSERT INTO DVDs (Name, NumDisks, RatingID, StatID)
VALUES ('Christmas', 1, 'NR', 's1'),
('Doc', 1, 'G', 's2'),
('Africa', 1, 'PG', 's1'),
('Falcon', 1, 'NR', 's2'),
('Amadeus', 1, 'PG', 's2'),
('Show', 2, 'NR', 's2'),
('View', 1, 'NR', 's1'),
('Mash', 2, 'R', 's2');
SELECT Name, RatingID AS Rating,
CASE RatingID
WHEN 'R' THEN 'Under 17 requires an alt.'
WHEN 'X' THEN 'No one 17 and under.'
WHEN 'NR' THEN 'Use discretion when renting.'
ELSE 'OK to rent to minors.'
END AS Policy
FROM DVDs
ORDER BY Name;
E. java oracle資料庫if語句問題
if (表不存在) then
execute immediate 'create tablespace ORDER_TABLESPACE' || chr(10) ||
'datafile "f:\order.dbf"'|| chr(10) ||
'size 200mb'|| chr(10) ||
'autoextend on next 20mb maxsize 400m';
end if;
這樣試試看
F. oracle中簡單if用法的問題
pl/sql的代碼一般都是寫在過程,函數和觸發器中,你寫的話要注意,單寫一段也沒有什麼問題
pl/sql的select語句要有東西接住查詢出來的值。這是與sql不同的地方:
DECLARE
v_tmp VARCHAR2(100);
BEGIN
IF 1=1 THEN
SELECT 1 INTO v_tmp FROM DUAL;
dbms_output.put_line(v_tmp);
END IF;
END;
G. oracle的sql中能不能使用if
用 case when then else end 就可以了
H. oracleif判斷語句
oracle的if語句採用decode函數。
DECODE(value,if1,then1,if2,then2,if3,then3,...,else)
表示如果value 等於if1時,DECODE函數的結果返回then1,...,如果不等於任何一個if值,則返回else。
Oracle資料庫是對標准sql語言的過程化擴展,因此產生了pl/sql語言。其中的if語句大量使用使得程序模塊化的功能方便實用。現在要討論的是if語句的基本使用方法。
連接資料庫
請輸入用戶名: scott/123456
設置環境變數
SQL> set serveroutput on
定義兩個字元串變數,然後賦值,接著使用if……then語句比較兩個字元串變數的長度,並輸出比較結果。
declare
a varchar(10);
b varchar(10);
begin
a:='beijing';
b:='guangdong';
if length(a)>length(b)
then dbms_output.put_line('a>b');
end if;
end;
過if……then……else語句實現只有年齡大於等於56歲,才可以申請退休,否則程序會提示不可以申請退休。
declare
a number(10);
begin
a:=&x;
if a>=56
then dbms_output.put_line('可以申請退休');
else dbms_output.put_line('不可以申請退休');
end if;
end;
制定一個月份數值,然後使用if……then……elsif語句判斷它所屬的季節,並輸出季節信息。
declare
mon number(10);
begin
mon:=&x;
if mon=3 or mon=4 or mon=5
then dbms_output.put_line('春節');
elsif mon=6 or mon=7 or mon=8 then dbms_output.put_line('夏季');
elsif mon=9 or mon=10 or mon=11 then dbms_output.put_line('秋季');
elsif mon=12 or mon=1 or mon=2 then dbms_output.put_line('冬季');
end if;
end;
制定一個季度數值,然後使用case語句判斷它所包含的月份信息並輸出。
declare
ss number(10);
begin
ss:=&x;
case
when ss=1 then dbms_output.put_line('包含月份3,4,5');
when ss=2 then dbms_output.put_line('包含月份6,7,8');
when ss=3 then dbms_output.put_line('包含月份9,10,11');
when ss=4 then dbms_output.put_line('包含月份12,1,2');
end case;
end;
I. oracle儲存過程中,if條件為某變數不等於1,怎麼寫
oracle儲存過程中,if條件為某變數不等於1,怎麼寫
oracle存儲過程中的if條件判斷的寫法:
比如:
temp varchar2(10) := '10000';
if temp <> '10000' then
insert into ...
else
update .......
end if;
J. oracle資料庫中可以用 if exists 嗎,我用為什麼報錯
對於Oracle中沒有 if exists(...) 的語法,目前有許多種解決方法,這里先分析常用的三種,推薦使用最後一種
第一種是最常用的,判斷count(*)的值是否為零,如下
declare
v_cnt number;
begin
select count(*) into v_cnt from T_VIP where col=1;
if v_cnt = 0 then
dbms_output.put_line('無記錄');
end if;
end;
首先這種寫法讓人感覺很奇怪,明明只需要知道表裡有沒有記錄,卻去統計了全表的記錄數。
這種方式對於小表而言可以接受,一旦表記錄很多的時候,性能問題就非常嚴重
因此有人就作了些修改,改成 select count(*) into v_cnt from T_VIP where col=1 and rownum=1
看起來似乎解決了性能問題,但是分析執行計劃可以知道,實際上是一樣的,不推薦使用。
第二種是所謂進攻式編程,不作預先判斷,而是直接默認通過判斷,然後使用 exception 來捕獲異常
比如我這里不判斷表中是否有滿足條件的記錄,默認它有,如果沒有就在異常中進行處理
declare
v_1 number;
begin
select vip_level into v_1 from T_VIP where 1=0;
exception
when no_data_found then
dbms_output.put_line('無記錄');
end;
這種方式從性能上講比第一種要好得多
不過首先它沒辦法適應所有的情況,如第一段代碼它就沒辦法改造
其次這種代碼看起來讓人覺得好像是發生了異常,而不是正常運行,從而造成混亂,不推薦使用。
第三種是利用 Oracle 原有的 Exists 語法,如下
declare
v_cnt number;
begin
select count(*)
into v_cnt
from al
where exists (select * from t_vip where col=1);
if v_cnt = 0 then
dbms_output.put_line('無記錄');
end if;
end;
通過在語句的外面套上一層al,來使用oracle原有的exists語法
雖然和第一種看起來類似,但分析執行計劃可以知道,性能比以上兩種都要好得多,與MSSQL的 if exists 最接近,推薦使用。
可以把判斷封裝成一個函數以方便使用,代碼如下
CREATE OR REPLACE FUNCTION EXISTS2 (IN_SQL IN VARCHAR2)
RETURN NUMBER
IS
/**********************************************************
* 使用示例
* begin
* if EXISTS2('select * from al where 1=1')=1 then
* dbms_output.put_line('有記錄');
* else
* dbms_output.put_line('無記錄');
* end if;
* end;
*****************************************************************/
V_SQL VARCHAR2(4000);
V_CNT NUMBER(1);
BEGIN
V_SQL := 'SELECT COUNT(*) FROM DUAL WHERE EXISTS (' || IN_SQL || ')';
EXECUTE IMMEDIATE V_SQL INTO V_CNT;
RETURN(V_CNT);
END;
-
對於常用的insert判斷還有更簡單的寫法,比如以下代碼
if not exists(select * from table1 where id=1)
insert into table1 values(1,'a');
可以改寫成
insert
when (not exists(select * from table1 where id=1)) then
into table1
select 1 as id, 'a' as data from al;
-
再比如以下的代碼
if not exists(select * from table1 where id=2)
insert into table1 values(2,'b')
else
update table1 set data='b' where id=2;
可以改寫成
merge into table1 his
using
(
select 2 as id, 'b' as data from al
) src
on (his.id=src.id)
when matched then
update set his.data=src.data where id=src.id
when not matched then
insert values(src.id,src.data);
-
這里附帶說下,有人喜歡把count(*)寫成count(列名),不推薦後一種,因為列名是需要額外的操作,去查詢系統表來定位列信息
另外count(1)和count(*)沒有差別,推薦使用count(*)直觀明了