SQL查询:在定义新字段时使用IF语句

时间:2010-05-08 08:48:06

标签: delphi ms-access

我有一个包含许多字段的表,还有几个布尔字段(例如: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引擎。

2 个答案:

答案 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