2010-06-16 15 views
2

我有一個返回布爾值的VBA函數IsValidEmail()。我有一個查詢調用這個函數:Expr1: IsValidEmail([E-Mail])。當我運行查詢時,它顯示-1爲真,0顯示爲False。到現在爲止還挺好。訪問:數據類型在查詢條件中使用布爾函數不匹配

現在我想過濾查詢,只顯示無效的電子郵件。我正在使用查詢設計器,所以我只需將一個值0添加到條件字段。這給我一個「數據類型不匹配」的錯誤。 "0"(帶引號)和False也是如此。我該如何爲布爾函數指定標準?

回答

1

該錯誤是由於我的表中的某些記錄具有空電子郵件而引起的。我的查詢有一個where條件來排除空的電子郵件記錄,所以當我在IsValidEmail列上沒有條件運行它時,我的函數只能用於具有非空電子郵件的記錄。但是,當我在IsValidEmail上添加條件時,它會爲每個記錄調用函數,並且錯誤來自嘗試將null傳遞給期望字符串的函數。

另一種方式說所有:

SELECT [E-Mail], 
     IsValidEmail([E-Mail]) <--Executed only for rows matching where clause 
FROM Contacts 
WHERE IsValidEmail([E-Mail]) = False; <-- Gets executed for all rows 

更改我的查詢表達式從IsValidEmail([E-Mail])IsValidEmail(nz([E-Mail],"X"))解決了這個問題。

+1

我打算建議您檢查IsValidEmail()的定義,以便它肯定返回布爾型而不是變體。如果它被定義爲Public Function IsValidEmail(...),它應該更改爲Public Function IsValidEmail(...)As Boolean。您也可以將其更改爲對傳遞的電子郵件地址使用變體,以便它可以在內部處理空值,而無需爲傳遞給它的每一行調用Nz()。這也可以添加一個可選參數,使您可以選擇將空郵件計爲有效或無效。 – 2010-06-16 20:55:36

+0

...繼續,對我來說,空郵件不是無效的電子郵件地址,只是一個缺少的電子郵件地址,這不是一回事。但你是否同意取決於你如何使用它。順便說一句,解析一個電子郵件地址的有效性實際上是一個相當複雜的過程,即使它的文本格式良好,但這並不意味着它實際上是一個有效的地址,因爲它不會反彈。 – 2010-06-16 20:57:03

+1

@Fenton:感謝您的反饋。我正在尋找一種方法,通過函數(顯式定義爲布爾btw)接受空值並在內部處理它們。我將實施您的變體參數方法。而且我很清楚電子郵件地址驗證的複雜性 - 關於這個問題已經有足夠的問題了,所以我不打算在這裏進行討論。 – BenV 2010-06-16 21:44:24

2

對於布爾列,「0」肯定會給你「標準表達式中的數據類型不匹配」錯誤。但是,0或False不加引號應該可以工作。我不明白他們爲什麼會產生相同的錯誤。

查看您是否可以通過直接編輯SQL來生成正在運行的查詢。創建一個新的查詢,切換到SQL視圖並粘貼到這個語句中(用您的表名替換YourTableName)。

SELECT IsValidEmail([E-Mail]) AS valid_email 
FROM YourTableName 
WHERE IsValidEmail([E-Mail]) = False; 

當您以這種方式創建它時,您的查詢是否會無誤地運行?

更新:由於該查詢也產生了相同的錯誤,我所能建議的是沒有任何標準嘗試這一個。

SELECT 
    IsValidEmail([E-Mail]) AS valid_email, 
    TypeName(IsValidEmail([E-Mail])) AS type_of_valid_email 
FROM YourTableName; 

但是,這似乎是一個遠射,因爲你已經告訴我們你以前的嘗試沒有標準跑沒有錯誤。如果這不能確定問題,你會考慮給我發送一份簡單的數據庫副本嗎?如果您有興趣,請告訴我,我會給您我的電子郵件地址。

+0

我複製/粘貼你的查詢到SQL視圖,更改表名並執行。同樣的錯誤。 – BenV 2010-06-16 01:57:35

+0

我在嘲笑一個發送給你的例子時想通了。謝謝! – BenV 2010-06-16 03:01:57

相關問題