我的查询无法正常工作。我正在尝试创建best_id
,并将空白设置为'n/a'
。
我也通过excel使用Microsoft.ACE.OLEDB.12.0
连接在我的工作簿中进行内部查询。
这是一个表格,显示每种情况的条件和我想要的best_id
值:
condition best_id value
------------------------------------------------ ------------------------------
bbg_id.[BbgType_MarketSectorDes] is not blank master.[Identifier]
bbg_cusip.[BbgType_MarketSectorDes] is not blank replace(master.[Identifier],' cusip','') & ' cusip'
bbg_isin.[BbgType_MarketSectorDes] is not blank replace(master.[Identifier],' isin','') & ' isin'
master.[Identifier] is not blank master.[Identifier]
all four of those fields are blank 'n/a'
我按优先顺序列出了这些条件;条件为True的第一行将是确定我的best_id
值的行,并且应忽略以下任何条件。
在我看来,Switch()
应该是这项工作的正确工具。然而,到目前为止,我的尝试(见下文)没有产生我想要的结果。
那么我的问题是Switch()
不是这项工作的正确工具,或者我无法弄清楚如何正确地应用它来满足我的需求?
以下是我失败的两次尝试:
switch(
bbg_id.[BbgType_MarketSectorDes] not like '[#]N/A%',master.[Identifier],
bbg_cusip.[BbgType_MarketSectorDes] not like '[#]N/A%',replace(master.[Identifier],' cusip','') & ' cusip',
bbg_isin.[BbgType_MarketSectorDes] not like '[#]N/A%',replace(master.[Identifier],' isin','') & ' isin',
master.[Identifier] is not null, master.[Identifier],
true,'n/a'
) as best_id,
尝试:
switch(
bbg_id.[BbgType_MarketSectorDes] not like "[#]N/A*",master.[Identifier],
bbg_cusip.[BbgType_MarketSectorDes] not like "[#]N/A*",replace(master.[Identifier],' cusip','') & ' cusip',
bbg_isin.[BbgType_MarketSectorDes] not like "[#]N/A*",replace(master.[Identifier],' isin','') & ' isin',
master.[ Identifier] is not null, master.[ Identifier],
true,"n/a"
) as best_id,
但我似乎无法在空白单元格中获得“不适用”。我应该尝试在这里使用iif
吗?尝试iif(master.[Identifier] is null ,"n/a",' '
)
而不是"n/a"
。
预期结果,目前是一个空白单元格,我的'n / a'是:
这是我在查询底部的连接,
from (([DB$] as master
left join
(select distinct [Identifier],[BbgType_MarketSectorDes] from [prev$]) as bbg_id
on bbg_id.[Identifier]=master.[Identifier])
left join
(select distinct [Identifier],[BbgType_MarketSectorDes] from [prev$]) as bbg_cusip
on bbg_cusip.[Identifier]= (master.[cusip] & ' cusip'))
left join
(select distinct [Identifier],[BbgType_MarketSectorDes] from [prev$]) as bbg_isin
on bbg_isin.[Identifier]= (master.[isin] & ' isin')
MS Access使用*
作为通配符,而不是%
。
MS Access中like
的通配符是*
,而不是%
。也许这就是你想要的:
switch(bbg_id.[BbgType_MarketSectorDes] not like "[#]N/A*", master.[Identifier],
bbg_cusip.[BbgType_MarketSectorDes] not like "[#]N/A*", replace(master[Identifier], " cusip", "") & " cusip",
bbg_isin.[BbgType_MarketSectorDes] not like "[#]N/A*", replace(master.[Identifier], " isin", "") & " isin",
master.[Identifier] is not null, master.[Identifier],
true, "n/a"
) as best_id,
MS Access通常使用双引号作为字符串而不是单引号,所以我也改变了它们(虽然这可能是可选的)。
因为您已标记Ms Access,所以可以使用NZ(Expression,ValueIfNull)函数来确定字符串字段是否为空或具有空字符串。 (NZ(master.[Identifier],'') = ''), 'N/A',
=>“N / A”如果该字段为空或“”
所以你的查询看起来像这样。
switch(
(NZ(master.[Identifier],'') = ''), 'N/A',
bbg_id.[BbgType_MarketSectorDes] not like '[#]N/A*',master.[Identifier],
bbg_cusip.[BbgType_MarketSectorDes] not like '[#]N/A*',replace(master.[Identifier],' cusip','') & ' cusip',
bbg_isin.[BbgType_MarketSectorDes] not like '[#]N/A*',replace(master.[Identifier],' isin','') & ' isin'
) as best_id,
您的条件/值对很容易转换为Switch()
表达式/值对。
Switch
(
Len(Trim(bbg_id.[BbgType_MarketSectorDes] & '')) > 0, master.[Identifier],
Len(Trim(bbg_cusip.[BbgType_MarketSectorDes] & '')) > 0, replace(master.[Identifier],' cusip','') & ' cusip',
Len(Trim(bbg_isin.[BbgType_MarketSectorDes] & '')) > 0, replace(master.[Identifier],' isin','') & ' isin',
Len(Trim(master.[Identifier] & '')) > 0, master.[Identifier],
True, 'n/a'
) AS best_id
我不确定你的“空白”值究竟是什么。可能性包括:
''
)Len(Trim([Field] & ''))
将同样处理这些案件; Len
将为零。所以Len(Trim([Field] & '')) > 0
确定了“非空白”值。
第五个表达式True
仅在以前的4个表达式都不是True
时进行评估。这意味着所有4个源字段都是“空白”,而Switch
应该返回'n / a'。