【问题标题】:SQL, iif excel cell is null then fill another excel cellSQL,如果excel单元格为空,则填充另一个excel单元格
【发布时间】:2018-10-25 23:31:52
【问题描述】:

我在 excel 中的以下查询部分不起作用。

iif(master.[Canada] is null or master.[USA] is null ,'USER','' ) as [Stackoverflow]

我是否正确地做空值?

逻辑应该

1) 如果没有加拿大或美国数据,请在 Stackoverflow 列中输入“USER”。

2) 如果加拿大或美国有数据,则 Stackoverflow 应为空。

目前我得到了什么:

+-----------+--------------+---------------+
|  Canada   |     USA      | Stackoverflow |
+-----------+--------------+---------------+
|           |              |               |
|           |              |               |
| 912796NZ8 |              |               |
|           |              |               |
|           | US912796NZ81 |               |
|           |              |               |
| 912796NZ8 | US912796NZ81 |               |
| 912796NZ8 | US912796NZ81 |               |
| 912796qd4 | US912796QD43 |               |
| 298785HB5 | US298785HB50 |               |
+-----------+--------------+---------------+

我的期望:

+-----------+--------------+---------------+
|  Canada   |     USA      | Stackoverflow |
+-----------+--------------+---------------+
|           |              | USER          |
|           |              | USER          |
| 912796NZ8 |              |               |
|           |              | USER          |
|           | US912796NZ81 |               |
|           |              | USER          |
| 912796NZ8 | US912796NZ81 |               |
| 912796NZ8 | US912796NZ81 |               |
| 912796qd4 | US912796QD43 |               |
| 298785HB5 | US298785HB50 |               |
+-----------+--------------+---------------+

将查询更改为iif(TRIM(master.[Camada]) = '' OR TRIM(master.[USA]) = '','USER', '') as [Stackoverflow]

它做得很好,除了现在我还有一些加拿大和美国的数据给我USER

+-----------+-----+---------------+
|  Canada   | USA | Stackoverflow |
+-----------+-----+---------------+
| 62941ZPA6 |     | USER          |
| 62943Z4R0 |     | USER          |
| 62945ZLQ1 |     | USER          |
| 62950ZZE5 |     | USER          |
| 75585RLK9 |     | USER          |
| 00433JAA3 |     | USER          |
| 13509PEV1 |     | USER          |
| 13509PEZ2 |     | USER          |
| 62931ZLX2 |     | USER          |
| 62941Z8M9 |     | USER          |
| 62941ZYK4 |     | USER          |
| 62942ZV42 |     | USER          |
| 62943Z6T4 |     | USER          |
| 62946Z6Y0 |     | USER          |
| 62947ZWC8 |     | USER          |
| 62948ZTJ6 |     | USER          |
| 62949ZE51 |     | USER          |
| 75585RLK9 |     | USER          |
| 75585RMB8 |     | USER          |
| 75585RMW2 |     | USER          |
+-----------+-----+---------------+

这 20 条记录不应该有 USER。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • @Parfait 谢谢!您的master.[Canada] = '' 工作了,您要回答吗?

标签: sql jet iif


【解决方案1】:

Jet/ACE SQL 方言支持IS NULL。但是,正如您当前的结果所示,空字符串 ('') 与 NULL 实体不同。在 Excel 中尤其如此(一个非数据库应用程序,其中空单元格可能不会默认为 NULL)。实际上,您实际上是在 IIF() 调用的 falsepart 中分配空字符串,其中 [Stackoverflow] 中没有 'USER' 值的记录将是空字符串而不是 @ 987654327@.

考虑扩展您的 IIF 表达式以考虑零长度字符串并将 NULL 分配给不匹配项:

IIF((master.[Canada] IS NULL AND master.[USA] IS NULL) OR
    (master.[Canada] = '' AND master.[USA] IS NULL) OR
    (master.[Canada] IS NULL AND master.[USA] = '') OR
    (master.[Canada] = '' AND master.[USA] = ''), 'USER', NULL) As [Stackoverflow]

甚至使用TRIM() 来解决不可见的空白:

IIF((master.[Canada] IS NULL AND master.[USA] IS NULL) OR
    (TRIM(master.[Canada]) = '' AND master.[USA] IS NULL) OR
    (master.[Canada] IS NULL AND TRIM(master.[USA]) = '') OR
    (TRIM(master.[Canada]) = '' AND TRIM(master.[USA]) = ''), 'USER', NULL) As [Stackoverflow]

【讨论】:

  • 感谢 Parfait,但现在我得到了加拿大和美国都包含“”的逻辑,但当其中一个是“”时,我也想排除“用户”。这很奇怪,因为它似乎有时有效,而不是一直有效。我会尝试添加修剪。
  • Hmmm... 如上所述使用OR 应该检查两列是否为空字符串。请解释初始数据、当前结果、预期结果。是的,请尝试TRIM,因为有看不见的空格。
  • 一个奇怪的观察,拥有IS NULL 部分实际上并没有多大帮助(4000 条用户所在的加拿大记录),但是当我删除它时,我只有 20 条用户所在的加拿大记录。
  • 再一次,所有这些条件都使用OR 运算符,因此如果记录落入其中的任何 个,则标记'USER'。除非有符合其逻辑的情况,否则删除不需要的条件不应改变结果。
  • 更新了问题,它的行为就像加拿大和美国都是空的,然后是用户,当它应该是空的时候,然后是用户。
【解决方案2】:

我认为,Jet 使用 IsNull() 函数而不是 IS NULL 运算符:

iif(IsNull(master.[Canada]) or IsNull(master.[USA]),'USER','' ) as [Stackoverflow]

【讨论】:

  • JET/ACE 确实支持IS NULLIsNull() is a VBA function JET 可以与之交互但有开销。
  • 感谢 cha,查询确实执行但没有给出预期结果:(
  • 它会产生什么结果以及用于什么数据?你能发布一些例子吗?
  • 我发布了一些示例数据,希望对您有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多