2011-05-30 14 views
3

我在Yes/No數據類型(布爾值)的表中有一個名爲DayShift的列。我想要的結果輸出是:如果值爲true,則顯示「Day」,否則顯示晚上。在Ms Access中使用iif子句來處理「Yes/No」數據類型數據類型

我曾嘗試以下:

SELECT iif(DayShift=Yes,"Day","Night") as Shift FROM table1; 

SELECT iif(DayShift,"Day","Night") as Shift FROM table1; 

SELECT iif(DayShift=True,"Day","Night") as Shift FROM table1; 

SELECT iif(DayShift=1,"Day","Night") as Shift FROM table1; 

但沒有上述工作。它只是給出了輸出數據表窗口中空白複選框的列表。我使用Ms Access 2003.任何幫助表示讚賞。

更新:

一點研究的是/否數據類型在MS Access 2003不能適當地處理空值之後。因此,錯誤。 Check this link for details.

更新2

房地產查詢與連接。沒有提到它,因爲我雖然上面提供的信息將工作。

SELECT tblovertime.contfirstname      AS [First Name], 
     tblovertime.contlastname       AS [Last Name], 
     tblovertime.employeenumber      AS [Employee Number], 
     tblsignup.thedate        AS [Sign Up Date], 
     Iif([tblOvertime.DayShift] =- 1, "Day", "Night") AS shift, 
     (SELECT Mid(MIN(Iif(sector = 1, "," & sector, NULL)) & MIN( 
           Iif(sector = 2, "," & sector, NULL)) & MIN( 
           Iif(sector = 3, "," & sector, NULL)) & MIN( 
          Iif(sector = 4, "," & sector, NULL)), 2) AS concat 
     FROM tblempsectorlist 
     WHERE tblempsectorlist.empnum = tblsignup.employeenumber 
     GROUP BY empnum)        AS sectors, 
     tblovertime.timedatecontact      AS [Date Contacted], 
     tblovertimestatus.name       AS status 
FROM (tblsignup 
     INNER JOIN tblovertime 
      ON (tblsignup.thedate = tblovertime.otdate) 
      AND (tblsignup.employeenumber = tblovertime.employeenumber)) 
     INNER JOIN tblovertimestatus 
     ON Clng(tblovertime.statusid) = tblovertimestatus.statusid 
WHERE (((tblsignup.thedate) ># 1/1/2011 #)) 
ORDER BY tblsignup.thedate; 
+0

如果列被稱爲'isDayShift',爲什麼使用'DayShift'查詢? – RedFilter 2011-05-30 19:13:32

+0

抱歉...我的專欄是'dayshift'。更新了問題 – reggie 2011-05-30 19:22:23

+1

看起來您的計算字段顯示爲布爾值而不是文本。在您的查詢設計中,打開屬性窗口,然後單擊Shift列。在字段屬性中,單擊查閱選項卡,並將顯示控件屬性設置爲文本框。 – 2011-05-30 19:47:58

回答

3

你的第二個具有正確

SELECT iif(DayShift,"Day","Night") as Shift FROM table1; 

我建議嘗試以下,看看有什麼實際上正在評估

SELECT iif(DayShift,"Day","Night") as Shift, DayShift FROM table1; 

你同樣可以做到

SELECT iif(DayShift = -1,"Day","Night") as Shift FROM table1; 

由於MS Access是存儲true爲-1,false爲0(它不像真實= 1那樣直觀,但它可能更快三三兩兩-恭維)評估

- 編輯 -
既然你似乎是使用連接,它可以結果在訥對是/否的,使用NZ()函數。

select iff(nz(DayShift, 0), "Day","Night") as Shift FROM table1; 

當DayShift出現null時,結果會返回0(false/no)。

+0

@CodeSlave最後的查詢運行良好。我想知道爲什麼它需要-1是真實的。感謝好友 – reggie 2011-05-31 12:30:10

+0

@CodeSlave它給了一個未知的錯誤,並使數據庫關閉。這發生了三次一次。原因是空值。 http://allenbrowne.com/noyesno.html – reggie 2011-05-31 14:19:49

+0

啊..你應該提到你正在使用連接。讓我爲你解決這個問題。 – BIBD 2011-05-31 15:09:47

0

我成功運行下面的查詢:

SELECT IIf([Table1]![isDayShift]=True,"Day","Night") AS Shift 
FROM Table1; 

我建立了這個在Access 2007(對不起,我沒有2003的副本躺在附近)。我看到的唯一區別是它給出了字段的完整路徑,而不僅僅是字段名稱。但是,這不應該是一個問題。如果它給你複選框,它似乎沒有看到這個字段是一個文本字段,而是作爲一個複選框字段。

底線是上面的查詢應該工作。

+2

'[Table1]![isDayShift]'是非常不標準的 - 除了對Access對象的引用外,在Jet/ACE SQL中並沒有使用重音。通常情況下,這將是一個點,[表1]。[isDayShift]'。 – 2011-05-30 22:31:12

+0

@ David-W-Fenton - 嗯,我使用Access查詢設計器來構建它,並且因爲它的目標是一個Access對象,所以這就是你如何做到的。 – IAmTimCorey 2011-05-30 22:43:38

+0

提到的查詢只是重新啓動了ms訪問數據庫。給出未知錯誤 – reggie 2011-05-31 02:39:05

0

您綁定的是「DayShift」,而不是表單中派生的「Shift」。

第三個查詢(=True)顯示隔離運行時應顯示日/夜。

1

這一條可能是愚蠢的,但....

如果你有在DayShift領域的一些Null值,Access將無法評估公式。你可以寫你的測試是這樣的:

iif(Nz(DayShift,0)=-1,"Day","Night") 
+0

如果DayShift不是布爾字段,則它只能爲空。如果它是一個布爾字段,則測試Null或從Null轉換是完全浪費時間(當然假設是Jet/ACE數據表)。 – 2011-06-08 23:44:22

0

Jet數據庫引擎(ACE,李連杰,等等)有一個聰明/愚蠢的功能,允許SELECT子句中的表達式引用一個AS條款(「列別名「)在相同的SELECT子句中,如果AS子句位於表達式的左側。這樣可以很容易地用測試數據測試表達式而不用表格(假設我認爲ANSI-92 Query Mode),例如嘗試執行任何單獨下面的語句:都應該工作,併產生預期的結果:

SELECT CBOOL(TRUE) AS DayShift, 
     IIF(DayShift = TRUE, 'Day', 'Night') AS Shift; 

SELECT CBOOL(FALSE) AS DayShift, 
     IIF(DayShift = TRUE, 'Day', 'Night') AS Shift; 

SELECT NULL AS DayShift, 
     IIF(DayShift = TRUE, 'Day', 'Night') AS Shift; 

SELECT CBOOL(TRUE) AS DayShift, 
     IIF(DayShift, 'Day', 'Night') AS Shift; 

SELECT CBOOL(FALSE) AS DayShift, 
     IIF(DayShift, 'Day', 'Night') AS Shift; 

SELECT NULL AS DayShift, 
     IIF(DayShift, 'Day', 'Night') AS Shift; 
+0

既然你提出這個建議,爲什麼你不確定是否需要ANSI 92模式? – 2011-06-02 20:36:28

+0

@ David-W-Fenton:我沒有在我的機器上安裝Access-the-front-end。相反,我使用VBA + ADO代碼來即時創建mdb等。無論如何,我只使用ANSI-92查詢模式。除了與傳統的Access-2000之前的代碼兼容(即不適用於我),我無法想象使用ANSI-89查詢模式的一個優點。我有點希望有人用「傳統」查詢模式來解釋我的答案(提示,提示)。 – onedaywhen 2011-06-03 07:22:06

+0

我假設說他們使用Access的人正在使用Access。你顯然不是,所以無論我推薦或建議可能與你的需求無關。當你自定義「訪問」的時候,你需要解析它,以便它根本不涉及數據庫開發工具。當然,在回答關於SO的問題時,這樣的澄清對於那些沒有以一種奇怪的方式定義「訪問」的人是有幫助的。不過,我懷疑你關心那些人。 – 2011-06-08 23:32:56

相關問題