2012年8月24日 星期五

擷取欄位中的部分字串


/* 截取字串*/

--LEFT( character_expression , integer_expression )
--LEFT( [字串], [數字(要擷取的長度)] )
SELECT LEFT(std_name,1) FROM SCORE

--RIGHT( character_expression , integer_expression )
--RIGHT( [字串], [數字(要擷取的長度)] )
SELECT RIGHT(std_name,1) FROM SCORE

--SUBSTRING( expression ,start , length )
--SUBSTRING( [字串], [數字(取值的起始位置)] , [數字(要擷取的長度)] )
select substring(std_name,1,1) 姓氏from score
select substring(std_name,2,10) 名字from score


substringVB用好久了,我竟然不知道在SQL裡面也有一樣的函式可以用。
我太孤陋寡聞了...




2012年8月23日 星期四

使用 TOP 篩選資料


/* TOP N PERCENT WITH TIES */
在工作上,使用到 TOP 的機會,不能算多,但還是會有用到。
但 TOP N PERCENT 就真的很少很少使用。
所以昨天上課時,要做老師出的題目。
在這邊做個紀錄,以後要用的話也比較好找。


-- TOP N 可以依照排序條件,取出前N筆資料。
SELECT TOP 5 *, co+db+sp+td 總分from score order by 總分


-- TOP N PERCENT 可以取出前N% 的資料。
SELECT TOP 5 PERCENT *, co+db+sp+td 總分from score order by 總分


-- TOP 5 WITH TIES 可以取符合前五名的資料(包含同分數的)
-- 舉例,假設前五名中,有個第五名同分,若只使用TOP 5 僅會取出筆資料。
-- 使用TOP 5 WITH TIES 則會取出筆資料。
SELECT TOP 5 WITH TIES *, co+db+sp+td 總分from score order by 總分


-- TOP 5 PERCENT WITH TIES 可以取符合前5% 的資料(包含同分數的)
SELECT TOP 5 PERCENT WITH TIES *, co+db+sp+td 總分from score order by 總分



欄位取別名的方式



/* 取別名的方式 */
1.使用 AS
2.使用 =
3.省略 AS


/* 參考:*/
SELECT std_num as 學生名稱 FROM personal
SELECT 學生名稱=std_num    FROM personal
SELECT std_num 學生名稱    FROM personal (這個方式我很少用...)

閱讀 SQL の MSDN 的參考


每次在看SQL的MSDN,常常都會一頭霧水。沒辦法,我是英文苦手。
最近看《SQL語法範例辭典》,看到〈關於本書的一些注意事項〉時,有種挖到寶的感覺。

以往看MSDN,大概會看到像下列這樣的東西。

SELECT [ ALL | DISTINCT ]
    [TOP expression [PERCENT] [ WITH TIES ] ]
    < select_list >
    [ INTO new_table ]
    [ FROM { <table_source> } [ ,...n ] ]
    [ WHERE <search_condition> ]
    [ GROUP BY [ ALL ] group_by_expression [ ,...n ]
                [ WITH { CUBE | ROLLUP } ]
    ]
    [ HAVING < search_condition > ]

有一大堆的中括弧、大括弧,還有一大堆的英文字。
明明就是很常使用的 SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY,但在 MSDN 上就是看得霧沙沙。

但在〈關於本書的一些注意事項〉中,有下面這樣的說明,稍微對照參數跟備註的部分,就容易閱讀的多了。
 
/* 語法 */
SELECT [ALL | DISTINCT ] expression [, expression ... ]
  FROM table_name [, table_name ... ]
[WHERE where_expression]
[GROUP BY expression [, expression ... ][HAVING where_expression ]]
[ORDER BY expression [, expression ... ]]

/* 參數 */
table_name        要選擇其中列資料的資料表名稱
expression        任意陳述式
where_expression  進一步篩選資料用的條件式

備註:
SELECT       保留字
table_name   任意名稱
column       任意名稱,但必須為欄位名稱
statement    SQL 的命令
expression   任意陳述式
[]           表示可以省略
()           這個括弧一定要寫
...          可以不斷重複
A|B          可選擇A B 其中一者
{A|B}        可選擇A B 其中一者,不用寫外側的大括弧

2012年8月22日 星期三

用Char來判斷字元是英文字母或數字

為了改良「判斷身分證字號及統一編號是否正確」,因此在檢查是否符合規則之前,先排除英文字母跟數字之外的其他文字。所以使用Char.IsNumberChar.IsLetter來判斷。


範例:
'檢查滿10碼的身分證字號
If x.Length = 10 then
    '檢查第一碼是否為英文字母
    If Not Char.IsLetter(x.Substring(0, 1)) Then 
        Return "第一碼應為英文字母。"
    End If

    '檢查其餘九碼是否為數字
    For i As Integer = 1 To x.Length - 1
        If Not Char.IsNumber(x.Substring(i, 1)) Then 
            Return "【所得人統一編(證)號】錯誤。"
        End If
    Next
End If


下面是其他的Char的公用方法:

IsControl       指示指定的 Unicode 字元是否分類為控制字元。 
IsDigit         指示 Unicode 字元是否分類為十進位數字。 
IsHighSurrogate 指出指定的 Char 物件是否為高 Surrogate。 
IsLetter        指示 Unicode 字元是否分類為字母。 
IsLetterOrDigit 指示 Unicode 字元是否分類為依字母順序排列的字母或十進位數字。 
IsLower         指示 Unicode 字元是否分類為小寫字母。 
IsLowSurrogate  指出指定的 Char 物件是否為低 Surrogate。 
IsNumber        指示 Unicode 字元是否分類為數字。 
IsPunctuation   指示 Unicode 字元是否分類為標點符號。 
IsSeparator     指示 Unicode 字元是否分類為分隔符號字元。 
IsSurrogate     指示 Unicode 字元是否分類為 Surrogate 字元。 
IsSurrogatePair 指出兩個指定的 Char 物件是否會組成 Surrogate 字組。 
IsSymbol        指示 Unicode 字元是否被分類為符號字元。 
IsUpper         指示 Unicode 字元是否分類為大寫字母。 
IsWhiteSpace    指示 Unicode 字元是否分類為泛空白字元 (White Space)。 

從 A table 複製整筆 Row 到 B table

紀錄一下,將整筆 Row 從 A table 複製到 B table 的新方法。

以前的話:
        '建立新的DataSet
        Dim P2_table As New DataSet

        '將  Rental 的結構放進 P2_table 中
        P2_table.Tables.Add(Rental.Clone)

        '執行迴圈
        For y As Integer = 0 To Rental.Rows.Count - 1
            '逐筆判斷 Rental 中的資料,是否有修改。
            If Rental.Rows(y).RowState = DataRowState.Modified Then
                '將修改後的資料,從 Rental 複製到 P2_table
                Dim dr As DataRow
                dr = P2_table.Tables(0).NewRow
                dr.BeginEdit()
                dr(0) = Rental.Rows(y).Item(0)
                dr(1) = Rental.Rows(y).Item(1)
                dr(2) = Rental.Rows(y).Item(2)
                dr(3) = Rental.Rows(y).Item(3)
                dr(4) = Rental.Rows(y).Item(4)

                dr.EndEdit()
                P2_table.Tables(0).Rows.Add(dr)
            End If
        Next


現在:
        '建立新的DataSet
        Dim P2_table As New DataSet

        '將  Rental 的結構放進 P2_table 中
        P2_table.Tables.Add(Rental.Clone)

        '執行迴圈
        For y As Integer = 0 To Rental.Rows.Count - 1
            '逐筆判斷 Rental 中的資料,是否有修改。
            If Rental.Rows(y).RowState = DataRowState.Modified Then
                '將修改後的資料,從 Rental 複製到 P2_table
                Dim dr As DataRow
                dr = P2_table.Tables(0).NewRow
                dr.ItemArray = Rental.Rows(y).ItemArray
                P2_table.Tables(0).Rows.Add(dr)
            End If
        Next



唉!笨了好幾年,沒想到可以直接複製整個陣列...

2012年8月14日 星期二

控制Textbox可以輸入的英、數字

 Private Sub t_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles t.KeyPress
       
        REM 控制可輸入的字每為數字或英文字每
        REM 若反白的長度等於欄位內文字的長度,允許全部空白。
        If CType(sender, TextBox).SelectedText.Length = CType(sender, TextBox).Text.Length Then CType(sender, TextBox).Text = ""

        REM Backspace
        If e.KeyChar = Chr(8) Then e.Handled = False : Exit Sub
        REM Delete
        If e.KeyChar = Chr(46) Then e.Handled = False : Exit Sub
        REM A to Z
        If CType(sender, TextBox).Text.Length = 0 And (e.KeyChar >= Chr(65) And e.KeyChar <= Chr(90)) Then e.Handled = False : Exit Sub
        REM a to z
        If CType(sender, TextBox).Text.Length = 0 And (e.KeyChar >= Chr(97) And e.KeyChar <= Chr(122)) Then e.Handled = False : Exit Sub
        REM Zero to nine
        If CType(sender, TextBox).Text.Length >= 1 And e.KeyChar >= Chr(48) And e.KeyChar <= Chr(57) Then e.Handled = False : Exit Sub

        REM 若上述比對皆不符,也就是第一碼不等於英文,後九碼不等於數字就...不允許輸入
        e.Handled = True REM 

    End Sub