日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
SQL中給varchar2(5)數(shù)據(jù)類型合適的約束

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

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)海豐,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

請(qǐng)建立一新表,包含三個(gè)列,全部都是varchar2(5)數(shù)據(jù)類型要求給這個(gè)表上加上合適的約束,使第一個(gè)列只能輸入“不含字母的字符串”(就是全部由數(shù)字或特殊符號(hào)等組成),第二個(gè)列只能輸入“包含字母的字符串”,第三個(gè)列只能輸入“全部是字母的字符串”

寫出相關(guān)的create table語(yǔ)句

結(jié)果很快有一同學(xué)就解答出來(lái)了,并且把原書的錯(cuò)誤也糾正了

隨后給出了問(wèn)題的答案:

這是他給的原始答案

create table x (a varchar2(5) check (upper(a)=a and lower(a)=a),

b varchar2(5) check (not upper(b)=b or not lower(b)=b),

c varchar2(5) check (length(translate(c,'

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',' '))=0));

這個(gè)答案還存在一些瑕疵

1每個(gè)列上還要給not null約束,他后來(lái)自己也很快發(fā)現(xiàn)這個(gè)問(wèn)題并且指出糾正。

2第一個(gè)check其實(shí)可以簡(jiǎn)化為upper(a)=lower(a),第二個(gè)check可以簡(jiǎn)化為upper(b)<>lower(b)

3第三個(gè)check使用的translate函數(shù)是神來(lái)之筆,原書上這個(gè)地方是錯(cuò)的。但translate的通用性不好,最好有通用性更好的辦法

對(duì)于老虎的這個(gè)答案,顯然還存在很多問(wèn)題。根據(jù)第三個(gè)問(wèn)題的答案分析,老虎這里的字母指的是英文字母,否則第三個(gè)問(wèn)題的答案就是不完整的。

那么下面就按照英文字母來(lái)理解題中所提到的字母,當(dāng)然字母代表英文字母也是絕大部分情況下正常的理解。

其實(shí)第一題和第二題的答案思路是一樣的,通過(guò)UPPER和LOWER函數(shù)是否相等,來(lái)判斷一個(gè)字符是否英文字符。這種方法是很不嚴(yán)謹(jǐn)?shù)模?/p>

SQL> SELECT UPPER(CHR(42660)), LOWER(CHR(42660)) FROM DUAL;

UP LO
-- --
Δ δ

這是一個(gè)最簡(jiǎn)單的例子,要想知道不滿足這個(gè)條件的結(jié)果有多少,可以執(zhí)行下面的PL/SQL代碼:

SQL> SET SERVEROUT ON SIZE 1000000
SQL> BEGINITPUB
  2   FOR I IN 1..65535 LOOP
  3    IF UPPER(CHR(I)) != LOWER(CHR(I)) AND LENGTH(CHR(I)) = 1
  4     DBMS_OUTPUT.PUT_LINE(I || ':' || CHR(I));ITPUB個(gè)人空間t F[ Z+D;Y
  5    END IF;
  6   END LOOP;
  7  END;
  8  /

當(dāng)然這里面大部分的結(jié)果是一個(gè)英文字母加上一個(gè)無(wú)法顯示的字符,但是既然可能存在這種現(xiàn)象,作為標(biāo)準(zhǔn)答案就可以考慮。何況,還有上面例子給出的希臘字符在內(nèi)的多種國(guó)家的字母。

憑經(jīng)驗(yàn)或主觀判斷利用UPPER和LOWER來(lái)判斷是否是英文字符的方法存在很多的不確定性,除非像上面一樣驗(yàn)證過(guò)所有的字符UPPER和LOWER的輸出結(jié)果。

其實(shí)對(duì)于這種問(wèn)題,可以利用LTRIM、REPLACE、TRANSLATE等函數(shù)來(lái)判斷,當(dāng)然對(duì)于高版本也可以使用正則表達(dá)式來(lái)進(jìn)行判斷。所有上面這些方法的共同點(diǎn)是在函數(shù)中明確指出了所有的可能性,比如利用LTRIM的方法:LTRIM(UPPER(C), ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’) IS NULL。

【編輯推薦】

  1. 在SQL Server中創(chuàng)建全局臨時(shí)表技巧
  2. 并行查詢讓SQL Server加速運(yùn)行
  3. SQL Server 2005常見(jiàn)問(wèn)題淺析

當(dāng)前名稱:SQL中給varchar2(5)數(shù)據(jù)類型合適的約束
文章源于:http://www.5511xx.com/article/djesces.html