SQL中給varchar2(5)資料型別合適的約束
資料庫課,開始的部分講sql,講到create table和約束,在虎吧上給他們留了一道思考題,是從那本著名的SQL Puzzles and Answers裡找的一道謎題,在原書上的解答其實是有錯誤的
請建立一新表,包含三個列,全部都是varchar2(5)資料型別要求給這個表上加上合適的約束,使第一個列只能輸入“不含字母的字串”(就是全部由數字或特殊符號等組成),第二個列只能輸入“包含字母的字串”,第三個列只能輸入“全部是字母的字串”
寫出相關的create table語句
結果很快有一同學就解答出來了,並且把原書的錯誤也糾正了
隨後給出了問題的答案:
這是他給的原始答案
這個答案還存在一些瑕疵
1每個列上還要給not null約束,他後來自己也很快發現這個問題並且指出糾正。
2第一個check其實可以簡化為upper(a)=lower(a),第二個check可以簡化為upper(b)<>lower(b)
3第三個check使用的translate函式是神來之筆,原書上這個地方是錯的。但translate的通用性不好,最好有通用性更好的辦法
對於老虎的這個答案,顯然還存在很多問題。根據第三個問題的答案分析,老虎這裡的字母指的是英文字母,否則第三個問題的答案就是不完整的。
那麼下面就按照英文字母來理解題中所提到的字母,當然字母代表英文字母也是絕大部分情況下正常的理解。
其實第一題和第二題的答案思路是一樣的,通過UPPER和LOWER函式是否相等,來判斷一個字元是否英文字元。這種方法是很不嚴謹的:
這是一個最簡單的例子,要想知道不滿足這個條件的結果有多少,可以執行下面的PL/SQL程式碼:
當然這裡面大部分的結果是一個英文字母加上一個無法顯示的字元,但是既然可能存在這種現象,作為標準答案就可以考慮。何況,還有上面例子給出的希臘字元在內的多種國家的字母。
憑經驗或主觀判斷利用UPPER和LOWER來判斷是否是英文字元的方法存在很多的不確定性,除非像上面一樣驗證過所有的字元UPPER和LOWER的輸出結果。
其實對於這種問題,可以利用LTRIM、REPLACE、TRANSLATE等函式來判斷,當然對於高版本也可以使用正規表示式來進行判斷。所有上面這些方法的共同點是在函式中明確指出了所有的可能性,比如利用LTRIM的方法:LTRIM(UPPER(C), ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’) IS NULL。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-611147/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料型別與約束資料型別
- 【MySQL】MySQL基礎(SQL語句、約束、資料型別)MySql資料型別
- SQL教程——常見的約束型別SQL型別
- 資料庫中欄位資料型別以及約束資料庫資料型別
- 32. 基本資料型別、約束條件資料型別
- MySQL——表的約束,資料型別,增刪查改MySql資料型別
- XML Schema 字串資料型別及約束詳解XML字串資料型別
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 用強資料型別保護你的表單資料-基於antd表單的型別約束資料型別
- SQL約束SQL
- SQL Server 資料表程式碼建立約束SQLServer
- SQL 資料型別SQL資料型別
- 塗鴉雲平臺資料型別和取值約束說明資料型別
- 【SQL】18 SQL NULL 函式、SQL 通用資料型別、SQL 用於各種資料庫的資料型別SQLNull函式資料型別資料庫
- TreeSet的null值與元素型別的約束Null型別
- 預設值+TS型別約束提高資料處理成功率型別
- [譯]Kotlin泛型中何時該用型別形參約束?Kotlin泛型型別
- LightDB 22.4 新特性之完全相容Oracle varchar2資料型別Oracle資料型別
- 綜合約束
- 泛型的約束理解泛型
- 組合資料型別資料型別
- SQL 常見資料型別SQL資料型別
- SQL Server-資料型別SQLServer資料型別
- SQL教程——常見的資料型別SQL資料型別
- 全網最適合入門的物件導向程式設計教程:42 Python常用複合資料型別-collections容器資料型別物件程式設計Python資料型別
- 【Redis】Redis的資料型別速查(5種基礎型別,5特殊型別)Redis資料型別
- 資料庫常用約束資料庫
- mysql資料庫約束MySql資料庫
- Java泛型(三):型別擦除帶來的約束與侷限性Java泛型型別
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- 【Python】組合資料型別Python資料型別
- Java中的基本資料型別與引用資料型別Java資料型別
- TS中特殊型別-any、unknown、never和extends繼承約束、keyof的使用型別繼承
- SQL Server日期資料型別DATE的使用SQLServer資料型別
- Sqlserver中所有約束的型別,建立、修改與刪除SQLServer型別
- (10)邏輯綜合新增約束(環境約束)
- 給前端返回資料全部轉字串合適嗎?前端字串
- 選擇適合的型別判斷方式型別
- Java中的資料型別Java資料型別