Home [SQL筆記] 流程控制
Post
Cancel

[SQL筆記] 流程控制

R

  • if begin-end else
  • case when-then-else end
  • while begin-end

特殊字符:

  • Tab: char(9)
  • 換行: char(10)
  • ENTER char(13)

選擇分支結構

if else

1
2
3
4
5
6
if
    begin
    end
else
    begin
    end

case end

1
2
3
4
case
    when 條件判斷 then 成立要做的事
    else 不成立要做的事,或是以上都不是,不知道什麼狀況
end 欄位別名

循環結構 While

1
2
3
4
5
declare @i int = 1--宣告i初始值為1
while @i<= 10 --當i<=10時,就執行
begin
 --TODO something
end

模擬銀行業務

選擇分支結構

範例1:取錢

(1)某用戶銀行卡號為”999998888802”
該用戶執行取錢操作,取錢5000元,餘額充足則進行取錢操作
並提示”取錢成功”,否則提示”餘額不足”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--(1)某用戶銀行卡號為"999998888802"
--該用戶執行取錢操作,取錢5000元,餘額充足則進行取錢操作
--並提示"取錢成功",否則提示"餘額不足"。
select * from AccountInfo
select * from BankCard
select * from CardExchange

declare @balance money--定義餘額變量
select @balance = (select CardMoney from BankCard where CardNo = '999998888802')--將查詢到的餘額放到@balance變量中
if @balance > 5000 --判斷卡餘額是否大於5000
    begin--可以取錢
        --取錢
        update BankCard 
        set CardMoney = CardMoney - 5000
        where CardNo = '999998888802'
        --添加交易記錢
        insert into CardExchange(CardNo,MoneyInBank,MoneyOutBank,ExchangeTime)
        values('999998888802',0,5000,GETDATE())
        --提示成功
        print '取錢成功'
    end
else--不能取錢
    begin
        print '餘額不足'
    end

先為餘額定義一個變量@balance,數據類型money,再select 卡的餘額給變量@balance,判斷餘額是否大於5000,成立就取錢,卡餘額要減5000(update set where),再添加交易記錄CardExchange(inert into),並提示”取錢成功”,不成立就提示”餘額不足”.

範例2:查詢case when+inner jonin

(2)查詢銀行卡信息,將銀行卡狀態1,2,3,4分別轉換為中文,1.正常2.掛失3.凍結4.註銷
並且根據銀行卡餘額顯示銀行卡等級
30萬二下為”普通用戶”,30萬以上為”VIP用戶”
顯示列分別為:卡號、身份証、姓名、餘額、用戶等級、銀行卡狀態

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--(2)查詢銀行卡信息,將銀行卡狀態1,2,3,4分別轉換為中文,1.正常2.掛失3.凍結4.註銷
--並且根據銀行卡餘額顯示銀行卡等級
--30萬二下為"普通用戶",30萬以上為"VIP用戶"
--顯示列分別為:卡號、身份証、姓名、餘額、用戶等級、銀行卡狀態
select CardNo 卡號, AccountCode 身份証, RealName 姓名, CardMoney 餘額,
case --用戶等級
    when CardMoney > 300000 then 'VIP用戶'--範圍的判斷,不能像下面這樣寫
    else '普通用戶'
end 用戶等級,--欄位別
case CardState--欄位名
    when 1 then '正常' --相等關係CardState = 1,欄位名可以寫在case後面,when後面直接寫結果1
    when 2 then '掛失'
    when 3 then '凍結'
    when 4 then '註銷'
    else '異常'--以上都不是,不知道什麼狀況
end 銀行卡狀態
from BankCard
inner join AccountInfo on BankCard.AccountId = AccountInfo.AccountId

使用inner join 結合兩張表,case when(類似switch case)去顯示銀行卡狀態,

  • case-end 中的 when-then若是相等關係(CardState=1),欄位名可以寫在case後面,when後面直接寫結果1。
  • case-end 中的 when-then若是範圍的判斷(CardMoney>300000),就不能這樣簡寫。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--一般寫法如下:
case
  when CardState = 1 then '正常' 
  when CardState = 2 then '掛失'
end

--相等關係(CardState=1),欄位名可以寫在case後面,when後面直接寫結果1

case CardState --欄位名
  when 1 then '正常' 
  when 2 then '掛失'
end

--範圍的判斷(CardMoney>300000),不能像上面面這樣寫
case
 when CardMoney > 300000 then 'VIP用戶'
 else --以上都不是要做的事
end

循環結構 While

範例1:循環印出1-10

1
2
3
4
5
6
7
--(1)循環印出1-10
declare @i int = 1 --宣告i初始值為1
while @i <= 10 --當i<=1時就執行
begin
    print @i --印出i
    set @i = @i + 1 --設置i+=1
end

範例2:循環印出99乘法表

特殊字符:

  • Tab: char(9)
  • 換行: char(10)
  • ENTER char(13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--(2)循環印出99乘法表
declare @i int = 1--宣告變數i初始值為1
while @i <= 9--外迴圈,當i<=9時執行
    begin
        declare @str varchar(1000) = ''--宣告變數str,用來組字串
        declare @j int = 1--宣告變數j初始值為1
        while @j <= @i--內迴圈,當j<=i時執行
            begin
                --組字串
                set @str = @str + cast(@j as varchar(1)) + '*' + cast(@i as varchar(1))+ '=' + cast(@i*@j as varchar(2)) + char(9)--char(9)為特殊字符:Tab鍵
                set @j = @j + 1--設置j+1
            end
        print @str--印出內迴圈組的字串,print會自動換行
        set @i = @i + 1--設置i+1
    end
This post is licensed under CC BY 4.0 by the author.