新聞中心
數(shù)據(jù)庫課,開始的部分講sql,講到create table和約束,在虎吧上給他們留了一道思考題,是從那本著名的SQL Puzzles and Answers里找的一道謎題,在原書上的解答其實是有錯誤的

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)海豐,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
請建立一新表,包含三個列,全部都是varchar2(5)數(shù)據(jù)類型要求給這個表上加上合適的約束,使第一個列只能輸入“不含字母的字符串”(就是全部由數(shù)字或特殊符號等組成),第二個列只能輸入“包含字母的字符串”,第三個列只能輸入“全部是字母的字符串”
寫出相關(guān)的create table語句
結(jié)果很快有一同學(xué)就解答出來了,并且把原書的錯誤也糾正了
隨后給出了問題的答案:
這是他給的原始答案
這個答案還存在一些瑕疵
1每個列上還要給not null約束,他后來自己也很快發(fā)現(xiàn)這個問題并且指出糾正。
2第一個check其實可以簡化為upper(a)=lower(a),第二個check可以簡化為upper(b)<>lower(b)
3第三個check使用的translate函數(shù)是神來之筆,原書上這個地方是錯的。但translate的通用性不好,最好有通用性更好的辦法
對于老虎的這個答案,顯然還存在很多問題。根據(jù)第三個問題的答案分析,老虎這里的字母指的是英文字母,否則第三個問題的答案就是不完整的。
那么下面就按照英文字母來理解題中所提到的字母,當(dāng)然字母代表英文字母也是絕大部分情況下正常的理解。
其實第一題和第二題的答案思路是一樣的,通過UPPER和LOWER函數(shù)是否相等,來判斷一個字符是否英文字符。這種方法是很不嚴(yán)謹(jǐn)?shù)模?/p>
這是一個最簡單的例子,要想知道不滿足這個條件的結(jié)果有多少,可以執(zhí)行下面的PL/SQL代碼:
當(dāng)然這里面大部分的結(jié)果是一個英文字母加上一個無法顯示的字符,但是既然可能存在這種現(xiàn)象,作為標(biāo)準(zhǔn)答案就可以考慮。何況,還有上面例子給出的希臘字符在內(nèi)的多種國家的字母。
憑經(jīng)驗或主觀判斷利用UPPER和LOWER來判斷是否是英文字符的方法存在很多的不確定性,除非像上面一樣驗證過所有的字符UPPER和LOWER的輸出結(jié)果。
其實對于這種問題,可以利用LTRIM、REPLACE、TRANSLATE等函數(shù)來判斷,當(dāng)然對于高版本也可以使用正則表達(dá)式來進(jìn)行判斷。所有上面這些方法的共同點是在函數(shù)中明確指出了所有的可能性,比如利用LTRIM的方法:LTRIM(UPPER(C), ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’) IS NULL。
【編輯推薦】
- 在SQL Server中創(chuàng)建全局臨時表技巧
- 并行查詢讓SQL Server加速運行
- SQL Server 2005常見問題淺析
分享題目:SQL中給varchar2(5)數(shù)據(jù)類型合適的約束
網(wǎng)站鏈接:http://www.5511xx.com/article/djesces.html


咨詢
建站咨詢
