SQL开关 - 为空白单元格填写'n / a'

问题描述 投票:2回答:4

我的查询无法正常工作。我正在尝试创建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'是:

enter image description here

这是我在查询底部的连接,

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')
sql ms-access switch-statement jet
4个回答
1
投票

MS Access使用*作为通配符,而不是%


1
投票

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通常使用双引号作为字符串而不是单引号,所以我也改变了它们(虽然这可能是可选的)。


1
投票

因为您已标记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,

1
投票

您的条件/值对很容易转换为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

我不确定你的“空白”值究竟是什么。可能性包括:

  1. 空值
  2. 空字符串(''
  3. 一个或多个空格,但没有其他字符

Len(Trim([Field] & ''))将同样处理这些案件; Len将为零。所以Len(Trim([Field] & '')) > 0确定了“非空白”值。

第五个表达式True仅在以前的4个表达式都不是True时进行评估。这意味着所有4个源字段都是“空白”,而Switch应该返回'n / a'。

© www.soinside.com 2019 - 2024. All rights reserved.