2010-05-08 67 views
1

我有一個包含許多字段和多個布爾字段(例如:BField1,BField2,BField3等)的表格。 我需要做一個選擇查詢,它將選擇除布爾值之外的所有字段,以及一個新的虛擬字段(例如:FirstTrueBool),其值等於第一個TRUE布爾字段的名稱。例如,假設我有BField1 = False,BField2 = True,BField3 = true,BField4 = false,那麼SQL Query應該將[FirstTrueBool]設置爲「BField2」。那可能嗎?SQL查詢:在定義新字段中使用IF語句

預先感謝您。

P.S.我使用Microsoft Access(MDB)數據庫和Jet Engine。

回答

1

如果您想保留當前架構(混合'x'非空狀態和'y'非狀態字段) (AFAIS現在)只使用IIF選項:

Select MyNonStatusField1, /* other non-status fields here */ 
    IIF([BField1], "BField1", 
    IIF([BField2], "BField2", 
... 
    IIF([BFieldLast], "BFieldLast", "#No Flag#") 
))))) -- put as many parenthesis as it needs to close the imbricated IIFs 
From 
    MyTable 

當然,你可以添加你喜歡的任何Where條款。


編輯: 或者您可以使用下面的技巧: 設置字段null在標誌爲false,並把訂單號(IOW,「1」爲BField1,「2」爲BField2等。 )當國旗是true。確保狀態字段是字符串(即在SQL術語Varchar(2),或者更好,Char(2)

然後你可以使用COALESCE功能,以返回來自這將是指數的狀態字段中的第一個非數值數字作爲字符串。然後你可以在這個字符串前添加你喜歡的任何文本(例如「BField」)。然後你會以類似的東西結束:

Select "BField" || Coalesce(BField1, BField2, BField3, BField4) /*etc. (add as many fields you like) */ 
From MyTable 

更清晰的恕我直言。

HTH

+0

謝謝,似乎是一個很好的解決方案! – 2010-05-08 10:43:27

+1

這個版本的MS Access可以使用嗎? – Fionnuala 2010-05-08 12:19:26

+0

它與Access 2003版本的MDB一起工作,但我遇到了一個小問題,請參閱 http:// stackoverflow。com/questions/2793980/parameter-xxx-has-no-default-value-error-when-order-by-in-sql-statement – 2010-05-08 12:32:06

1

您最好使用一個'int'列作爲位集(提供最多32列)來表示列。

例如請參閱SQL Server: Updating Integer Status Columns(它是SQL服務器,但同樣的技術同樣適用於MS Access)

+0

是的,我後來想通了,這是一個更好的選擇,但我已經做舊的方式,並改變這將是痛苦的:) – 2010-05-08 09:23:26

+1

不過,現在有點疼,可能會在以後防止很多疼痛...... – 2010-05-08 09:50:18

+0

不過,我需要在那裏放置某種IF語句。例如,如果值是0101,那麼我希望虛擬域等於「Field2」,那麼我如何在SQL中實現它? – 2010-05-08 10:25:41