回 帖 发 新 帖 刷新版面

主题:[讨论]在SELECT SQL中使用ALLTRIM()函數的怪問題

CREATE SQL VIEW V_TEMP_PARTNO1 AS SELE PART_NO.*;
    FROM CMADE!PART_NO INNER JOIN CMADE!FILELIST ON UPPER(ALLTRIM(PART_NO.料號))=ALLTRIM(UPPER(FILELIST.關鍵字));
    WHERE UPPER(ALLTRIM(FILELIST.文件類別))="工程料號" .AND. [color=FF0000]ALLT(UPPER(FILELIST.審核狀況))<>"Y";[/color]    ORDER BY PART_NO.料號
[color=FF0000]注:以上這一段查出不任何數據"[/color]

CREATE SQL VIEW V_TEMP_PARTNO1 AS SELE PART_NO.*;
    FROM CMADE!PART_NO INNER JOIN CMADE!FILELIST ON UPPER(ALLT(PART_NO.料號))=ALLTRIM(UPPER(FILELIST.關鍵字));
    WHERE UPPER(ALLTRIM(FILELIST.文件類別))="工程料號" .AND. [color=FF0000]UPPER(FILELIST.審核狀況)<>"Y";" [/color]
    ORDER BY PART_NO.料號
[color=FF0000]注:以上這一段可以得到兩條符合的記錄[/color]

CREATE SQL VIEW V_TEMP_PARTNO1 AS SELE PART_NO.*;
    FROM CMADE!PART_NO INNER JOIN CMADE!FILELIST ON UPPER(ALLTRIM(PART_NO.料號))=ALLTRIM(UPPER(FILELIST.關鍵字));
    WHERE UPPER(ALLTRIM(FILELIST.文件類別))="工程料號" .AND. [color=FF0000]EMPT(FILELIST.審核狀況)=.T.;[/color]
    ORDER BY PART_NO.料號
[color=FF0000]注:以上這一段可以得到兩條符合的記錄[/color]

CREATE SQL VIEW V_TEMP_PARTNO1 AS SELE PART_NO.*;
    FROM CMADE!PART_NO INNER JOIN CMADE!FILELIST ON UPPER(ALLT(PART_NO.料號))=ALLTRIM(UPPER(FILELIST.關鍵字));
    WHERE UPPER(ALLTRIM(FILELIST.文件類別))="工程料號" .AND. [color=FF0000]UPPER(FILELIST.審核狀況)="Y";[/color]
    ORDER BY PART_NO.料號
[color=FF0000]注:以上這一段可以得到很多條符合的記錄
真的無比的驚訝,為什麼增加一個ALLT(刪除空字符,我用LTRI加上RTRI替換也是一樣的效果)就沒有記錄產生?在SQL語句中,是如何對空串操作及對運算符<>是如何進行比對的?
PS:數據源的"審核狀況"字段為字符型的空串,EXAC設置的是精確比較[/color]

回复列表 (共2个回复)

沙发

真的無比的驚訝!!
其实一点儿都不惊讶,只要知道一些规则:
1.SET EXACT 与SQL无关
2.在Where子句中,空串和任何串(不管空不空)相等,除非用"=="比较

你不给一点具体数据,既然你用到Alltrim函数处理“審核狀況”,俺假定该字段宽度不是1(具体是多少与俺下面要说的无关)。

俺可以用几条记录重现你列出的4种现象,参考一下
 
FILELIST共4条记录,其中審核狀況取值分别为 空格串、"Y   "、空格串、"Y   "

(1)ALLT(UPPER(FILELIST.審核狀況))<>"Y" 
当審核狀況为空,"<>"号左侧计算出""(空串),因为规则2,所以""<>"Y"为假
当審核狀況为"Y   ","<>"号左侧计算出"Y","Y"<>"Y"当然为假
现象:查出不任何數據

(2)UPPER(FILELIST.審核狀況)<>"Y"
当審核狀況为空,"<>"号左侧计算出"  "(空格串),所以"   "<>"Y"为真
当審核狀況为"Y   ","<>"号左侧计算出"Y   ","Y   "<>"Y"当然为假
现象:可以得到兩條符合的記錄

(3)EMPT(FILELIST.審核狀況)=.T.
当審核狀況为空,"="号左侧计算出.T.,所以.T.=.T.为真
当審核狀況为"Y   ","="号左侧计算出.F.,所以.F.=.T.为假
现象:可以得到兩條符合的記錄

(4)UPPER(FILELIST.審核狀況)="Y"
当審核狀況为空,"="号左侧计算出"  "(空格串),所以"   "="Y"为假
当審核狀況为"Y   ","Y   "="Y"当然为真
现象:可以得到兩條符合的記錄

板凳


  萬分感謝您的SQL語句中,空串和任何字串相等及與SET EXACT設置無關!

我来回复

您尚未登录,请登录后再回复。点此登录或注册