我有一个包含许多字段的表,还有几个布尔字段(例如:BField1,BField2,BField3等)。 我需要创建一个Select Query,它将选择除布尔值之外的所有字段,以及一个新的虚拟字段(例如:FirstTrueBool),其值等于第一个TRUE布尔字段的名称。
例如:假设我有BField1 = False,BField2 = True,BField3 = true,BField4 = false,在这种情况下,SQL Query应将[FirstTrueBool]设置为“BField2”。这可能吗?
提前谢谢。
P.S。我使用Microsoft Access(MDB)数据库和Jet引擎。
答案 0 :(得分:1)
最好使用单个“int”列作为位集(假设您最多有32列)来表示列。
e.g。请参阅SQL Server: Updating Integer Status Columns(它是sql server,但同样的技术同样适用于MS Access)
答案 1 :(得分: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
,并在标志为true
时放置订单号(对于BField1为iow,“1”,对于BField2等为“2”)。确保状态字段是字符串(即Varchar(2)
或更好,SQL术语中的Char(2)
)
然后,您可以使用COALESCE函数从状态字段返回第一个非值,该字段将作为索引号作为字符串。然后你可以在这个字符串前面添加你喜欢的任何文本(例如“BField”)。然后你将结束如下:
Select "BField" || Coalesce(BField1, BField2, BField3, BField4) /*etc. (add as many fields you like) */
From MyTable
恕我直言更清楚。
HTH