逻辑函数

本文介绍 Tableau 中的逻辑函数及其用途。它还使用示例来演示如何创建逻辑计算。

为什么使用逻辑计算

逻辑计算允许您确定某个特定条件为真还是假(布尔逻辑)。例如,您可能希望根据某些截止值对值进行分类。

逻辑计算可能如下所示:

IF [Profit] > 0 
THEN 'Profitable'
ELSEIF [Profit] = 0 THEN 'Break even'
ELSE 'Loss'
END

Tableau 中的可用逻辑函数和运算符

AND

语法<expr1> AND <expr2>
定义对两个表达式执行逻辑合取运算。(如果两边都为 true,则逻辑测试返回 true。)
输出布尔值(True 或 False)
示例
IF [Season] = "Spring" AND "[Season] = "Fall" 
THEN "It's the apocalypse and footwear doesn't matter"
END

“如果(Season = Spring)和(Season = Fall)同时为 true,则返回“It's the apocalypse and footwear doesn't matter”。

说明

通常与 IF 和 IIF 一起使用。另请参见 NOT 和 或者。

如果两个表达式都为 TRUE(即不为 FALSE 或 NULL),则结果为 TRUE。如果任一表达式为 NULL,则结果为 NULL。在所有其他情况下,结果都为 FALSE。

如果所创建的计算中的 AND 比较结果显示在工作表上,则 Tableau 显示 TRUE 和 FALSE。如果要更改此情况,请使用设置格式对话框中的“设置格式”区域。

注意:AND 运算符使用短路计算。这表示如果第一个表达式计算为 FALSE,则根本不会计算第二个表达式。如果第二个表达式在第一个表达式为 FALSE 时产生错误,则这可能十分有用,因为在这种情况下从不计算第二个表达式。

CASE

语法CASE <expression>
WHEN <value1> THEN <then1>
WHEN <value2> THEN <then2>
...
[ELSE <default>]
END
输出取决于 <then> 值的数据类型。
定义

对 expression 进行求值,并将其与指定选项(<value1>、<value2> 等)进行比较。遇到一个与表达式匹配的 value 时,CASE 返回相应的 return。如果未找到匹配值,则返回(可选)默认值。如果不存在默认值并且没有任何值匹配,则会返回 Null。

示例
CASE [Season] 
WHEN 'Summer' THEN 'Sandals'
WHEN 'Winter' THEN 'Boots'
ELSE 'Sneakers'
END

“看看“Season”字段。如果值为 Summer,则返回 Sandals。如果值为 Winter,则返回 Boots。如果计算中的选项均不匹配“Season”字段中的选项,则返回 Sneakers。”

说明

另请参见 IF 和 IIF。

与 WHEN、THEN、ELSE 和 END 结合使用。

提示:很多时候,您可以使用组来获得与复杂 CASE 函数相同的结果,或者使用 CASE 来替换本机分组功能,例如前面的示例。您可能想测试哪个更适合您的场景。

ELSE

语法CASE <expression>
WHEN <value1> THEN <then1>
WHEN <value2> THEN <then2>
...
[ELSE <default>]
END
定义IF 或 CASE 表达式的一个可选部分,用于指定如果没有一个测试表达式为 true 则返回的默认值。
示例
IF [Season] = "Summer" THEN 'Sandals' 
ELSEIF [Season] = "Winter" THEN 'Boots'
ELSE 'Sneakers' 
END
CASE [Season] 
WHEN 'Summer' THEN 'Sandals'
WHEN 'Winter' THEN 'Boots'
ELSE 'Sneakers'
END
说明

与 CASE、WHEN、IF、ELSEIF、THEN 和 END 一起使用

ELSE 对于 CASE 和 IF 是可选的。在计算中,其中ELSE未指定,如果没有<test> 为 true 时,整体计算将返回 null。

ELSE不需要条件(例如 [Season] = "Winter")并且可以被认为是 null 处理的一种形式。

ELSEIF

语法[ELSEIF <test2> THEN <then2>]
定义IF 表达式的一个可选部分,用于指定初始 IF 之外的附加条件。
示例
IF [Season] = "Summer" THEN 'Sandals' 
ELSEIF [Season] = "Winter" THEN 'Boots'
ELSEIF [Season] = "Spring" THEN 'Sneakers'
ELSEIF [Season] = "Autumn" THEN 'Sneakers'
ELSE 'Bare feet'
END
说明

与 IF、THEN、 ELSE 和 END 一起使用

ELSEIF 可以被认为是额外的 IF 子句。ELSEIF 是可选的,并且可以重复多次。

与 ELSE 不同,ELSEIF 需要一个条件(例如 [Season] = "Winter")。

END

定义用于结束一个 IF 或 CASE 表达式。
示例
IF [Season] = "Summer" THEN 'Sandals' 
ELSEIF [Season] = "Winter" THEN 'Boots'
ELSE 'Sneakers' 
END

“如果 Season = Summer,,则返回 Sandals。否则,请查看下一个表达式。如果 Season = Winter,则返回 Boots。如果两个表达式都不为 true,则返回 Sneakers。”

CASE [Season] 
WHEN 'Summer' THEN 'Sandals'
WHEN 'Winter' THEN 'Boots'
ELSE 'Sneakers'
END

“看看“Season”字段。如果值为 Summer,则返回 Sandals。如果值为 Winter,则返回 Boots。如果计算中的选项均不匹配“Season”字段中的选项,则返回 Sneakers。”

说明

与 CASE、WHEN、IF、ELSEIF、THEN 和 ELSE 一起使用。

IF

语法IF <test1> THEN <then1>
[ELSEIF <test2> THEN <then2>...]
[ELSE <default>]
END
输出取决于 <then> 值的数据类型。
定义

测试一系列表达式,同时为第一个为 true 的 <test> 返回 <then> 值。

示例
IF [Season] = "Summer" THEN 'Sandals' 
ELSEIF [Season] = "Winter" THEN 'Boots'
ELSE 'Sneakers' 
END

“如果 Season = Summer,,则返回 Sandals。否则,请查看下一个表达式。如果 Season = Winter,则返回 Boots。如果两个表达式都不为 true,则返回 Sneakers。”

说明

另请参见 IF 和 IIF。

与 ELSEIF、THEN、ELSE 和 END 一起使用

IFNULL

语法IFNULL(expr1, expr2)
输出取决于 <expr> 值的数据类型。
定义

如果 <expr1> 不为 null,则返回该表达式,否则返回 <expr2>。

示例
IFNULL([Assigned Room], "TBD")

“如果“Assigned Room”(分配的房间)字段不为 null,则返回其值。如果“Assigned Room”(分配的房间)字段为 null,则返回 TBD。”

说明

与 ISNULL 进行比较。IFNULL 始终返回一个值。ISNULL 返回一个布尔值(true 或 false)。

另请参见 ZN。

IIF

语法IIF(<test>, <then>, <else>, [<unknown>])
输出取决于表达式中值的数据类型。
定义检查是否满足条件(<test>),并在 test 为 true 时返回 <then>,在 test 为 false 时返回 <else>,如果 test 为 null 则为可选值 <unknown>。如果未指定可选的 unknown,IIF 将返回 null。
示例
IIF([Season] = 'Summer', 'Sandals', 'Other footwear')

“如果 Season = Summer,,则返回 Sandals。否则返回 Other footwear”

IIF([Season] = 'Summer', 'Sandals', 
IIF('Season' = 'Winter', 'Boots', 'Other footwear')
)

“如果 Season = Summer,,则返回 Sandals。否则,请查看下一个表达式。如果 Season = Winter,则返回 Boots。如果两者均不为 true,则返回 Sneakers。”

IIF('Season' = 'Summer', 'Sandals', 
IIF('Season' = 'Winter', 'Boots',
IIF('Season' = 'Spring', 'Sneakers', 'Other footwear')
)
)

“如果 Season = Summer,,则返回 Sandals。否则,请查看下一个表达式。如果 Season = Winter,则返回 Boots。如果没有一个表达式为 true,则返回 Sneakers。”

说明

另请参见 IF 和 CASE。

IIF 没有等同于 ELSEIF(如 IF)或重复 WHEN 子句(如 CASE)的语句。相反,可以通过将 IIF 语句嵌套为 <unknown> 元素来按顺序计算多个测试。返回第一个(最外面的)true。

也就是说,在下面的计算中,结果将是红色,而不是橙色,因为一旦 A=A 计算为 true,表达式就会停止计算:

IIF('A' = 'A', 'Red', IIF('B' = 'B', 'Orange', IIF('C' = 'D', 'Yellow', 'Green')))

IN

语法<expr1> IN <expr2>
输出布尔值(True 或 False)
定义如果 <expr1> 中的任何值与 <expr2> 中的任何值匹配,则返回 TRUE。
示例
SUM([Cost]) IN (1000, 15, 200)

“Cost 字段的值是 1000、15 还是 200?”

[Field] IN [Set]

“该字段的值是否存在于集合中?”

说明

<expr2> 中的值可以是集、文本值列表或合并字段。

另请参见 WHEN。

ISDATE

语法ISDATE(string)
输出布尔值(True 或 False)
定义如果 <string> 为有效日期,则返回 true。输入表达式必须是字符串(文本)字段。
示例
ISDATE("2018-09-22")

“字符串 2018-09-22 是格式正确的日期吗?”

说明

什么被视为有效日期取决于对计算求值的系统的区域设置(链接在新窗口中打开)。例如:

在美国:

  • ISDATE("2018-09-22") = TRUE
  • ISDATE("2018-22-09") = FALSE

在英国:

  • ISDATE("2018-09-22") = FALSE
  • ISDATE("2018-22-09") = TRUE

ISNULL

语法ISNULL(expression)
输出布尔值(True 或 False)
定义

如果 <expression> 为 NULL(未包含有效数据),则返回 true。

示例
ISNULL([Assigned Room])

“Assigned Room(分配的房间)字段是否为 null?”

说明

与 IFNULL 进行比较。IFNULL 始终返回一个值。ISNULL 返回一个布尔值。

另请参见 ZN。

MAX

语法MAX(expression) 或 MAX(expr1, expr2)
输出与参数相同的数据类型,或者,如果参数的任何部分为 null,则为 NULL 。
定义

返回两个参数(必须为相同数据类型)中的最大值。

MAX 也可以聚合形式应用于单个字段。

示例
MAX(4,7) = 7
MAX(#3/25/1986#, #2/20/2021#) = #2/20/2021#
MAX([Name]) = "Zander"
说明

对于字符串

MAX 通常是按字母顺序排在最后的值。

对于数据库数据源,MAX 字符串值在数据库为该列定义的排序序列中最高。

对于日期

对于日期,MAX 是最近的日期。如果 MAX 是聚合,结果不会有日期层次结构。如果 MAX 是比较,结果将保留日期层次结构。

作为聚合

MAX(expression) 是聚合函数,返回单个聚合结果。这在可视化项中显示为 AGG(expression)。

作为比较

MAX(expr1, expr2) 比较这两个值并返回一个行级值。

另请参见 MIN。

MIN

语法MIN(expression) 或 MIN(expr1, expr2)
输出与参数相同的数据类型,或者,如果参数的任何部分为 null,则为 NULL 。
定义

返回两个参数(必须为相同数据类型)中的最小值。

MIN 也可以聚合形式应用于单个字段。

示例
MIN(4,7) = 4
MIN(#3/25/1986#, #2/20/2021#) = #3/25/1986#
MIN([Name]) = "Abebi"
说明

对于字符串

MIN 通常是按字母顺序排列在前面的值。

对于数据库数据源,MIN 字符串值在数据库为该列定义的排序序列中最低。

对于日期

对于日期,MIN 是最早的日期。如果 MIN 是聚合,结果不会有日期层次结构。如果 MIN 是比较,结果将保留日期层次结构。

作为聚合

MIN(expression) 是聚合函数,返回单个聚合结果。这在可视化项中显示为 AGG(expression)。

作为比较

MIN(expr1, expr2) 比较这两个值并返回一个行级值。

另请参见 MAX。

NOT

语法NOT <expression>
输出布尔值(True 或 False)
定义对一个表达式执行逻辑非运算。
示例
IF NOT [Season] = "Summer" 
THEN 'Don't wear sandals'
ELSE 'Wear sandals' 
END

“如果 Season 不等于 Summer,则返回 Don't wear sandals。否则,返回 Wear sandals。”

说明

通常与 IF 和 IIF 一起使用。另请参见 AND 和 或者。

或者

语法<expr1> OR <expr2>
输出布尔值(True 或 False)
定义对两个表达式执行逻辑析取操作。
示例
IF [Season] = "Spring" OR [Season] = "Fall" 
THEN "Sneakers"
END

“如果 (Season = Spring) 或 (Season = Fall) 为 true,则返回 Sneakers。”

说明

通常与 IF 和 IIF 一起使用。另请参见 AND 和 NOT。

如果任一表达式为 TRUE,则结果为 TRUE。如果两个表达式都为 FALSE,则结果为 FALSE。如果两个表达式都为 NULL,则结果为 NULL。

如果所创建的计算中的 OR 将比较结果显示在工作表上,则 Tableau 显示 TRUE 和 FALSE。如果要更改此情况,请使用设置格式对话框中的“设置格式”区域。

注意:OR 运算符使用短路计算。这表示如果第一个表达式计算为 TRUE,则根本不会计算第二个表达式。如果第二个表达式在第一个表达式为 TRUE 时产生错误,则这可能十分有用,因为在这种情况下从不计算第二个表达式。

THEN

语法IF <test1> THEN <then1>
[ELSEIF <test2> THEN <then2>...]
[ELSE <default>]
END
定义IF、ELSEIF 或 CASE表达式的必需部分,用于定义如果特定值或测试为 true 则返回什么结果。
示例
IF [Season] = "Summer" THEN 'Sandals' 
ELSEIF [Season] = "Winter" THEN 'Boots'
ELSE 'Sneakers' 
END

“如果 Season = Summer,,则返回 Sandals。否则,请查看下一个表达式。如果 Season = Winter,则返回 Boots。如果两个表达式都不为 true,则返回 Sneakers。”

CASE [Season] 
WHEN 'Summer' THEN 'Sandals'
WHEN 'Winter' THEN 'Boots'
ELSE 'Sneakers'
END

“看看“Season”字段。如果值为 Summer,则返回 Sandals。如果值为 Winter,则返回 Boots。如果计算中的选项均不匹配“Season”字段中的选项,则返回 Sneakers。”

说明

与 CASE、WHEN、IF、ELSEIF、THEN、ELSE 和 END 一起使用

WHEN

语法CASE <expression>
WHEN <value1> THEN <then1>
WHEN <value2> THEN <then2>
...
[ELSE <default>]
END
定义CASE 表达式的必需部分。查找第一个与 <expression> 匹配的 <value>,并返回对应的 <then>。
示例
CASE [Season] 
WHEN 'Summer' THEN 'Sandals'
WHEN 'Winter' THEN 'Boots'
ELSE 'Sneakers'
END

“看看“Season”字段。如果值为 Summer,则返回 Sandals。如果值为 Winter,则返回 Boots。如果计算中的选项均不匹配“Season”字段中的选项,则返回 Sneakers。”

说明

与 CASE、THEN、ELSE 和 END 一起使用。

CASE 也支持 WHEN IN构造,例如:

CASE <expression> 
WHEN IN <set1> THEN <then1>
WHEN IN <combinedfield> THEN <then2>
...
ELSE <default>
END

WHEN IN 中的值可以是集、文本值列表或合并字段。另请参见 IN。

ZN

语法ZN(expression)
输出取决于 <expression> 的数据类型,或者为 0。
定义如果 <expression> 不为 null,则返回该表达式,否则返回零。
示例
ZN([Test Grade])

“如果测试成绩不为 null,则返回其值。如果测试成绩为 null,则返回 0。”

说明

ZN 是 IFNULL 的特殊情况,其中如果表达式为 null,则替代项始终为 0,而不是在计算中指定。

ZN 在执行额外计算时特别有用,并且 null 将使整个计算为 null。但是,请谨慎将这些结果解释为 null 并不总是与 0 同义,并且可能代表缺失数据。

另请参见 ISNULL。


注意:其中一些实际上是逻辑运算符,显示为黑色,而不是蓝色。有关详细信息,请参见运算符语法。

关于 CASE、IF 和 IIF 的注释

CASE 通常比 IF 或 II F更易于使用。在许多情况下,IF、IIF 和 CASE 可以互换使用。CASE 语句始终可重写为 IF 语句,不过 CASE 函数一般更加简明且更容易理解。但是,并非所有 IF 语句都可以编写为 CASE 语句,因为每个 ELSEIF 可能引用不同的字段。

提示:让我们比较一下在这三个函数中使用相同逻辑的示例:

CASEIFIIF
CASE [Region]
WHEN 'West' THEN 1
WHEN 'East' THEN 2
WHEN 'South' THEN 3
WHEN 'North' Then 4
ELSE 5
END
IF [Region] = 'West' THEN 1
ELSEIF [Region] = 'East' THEN 2
ELSEIF [Region] = 'South' THEN 3
ELSEIF [Region] = 'North' THEN 4
ELSE 5
END
IIF([Region] = 'West', 1,
IIF([Region] = 'East', 2,
IIF([Region] = 'South', 3,
IIF([Region] = 'North', 4,
5, 0)
)
)
)

CASE 结构非常简单,易于编写和理解。但是,与 IF 或 IIF 不同,表达式(此处为 [Region])不能是逻辑运算。

CASE 的 null 值处理方式与 IF 的处理方式相同。

IF THEN 结构允许多个 ELSEIF 子句,这使得多次计算比 IIF 更容易。

null 值处理:任何未知 (null) 结果都由与 false 结果相同的 ELSE 子句处理。这里,除了指定的四个区域(包括 null)之外的任何区域都将被分配值 5。

IIF 结构以不同于 false 结果的方式处理未知结果,并且具有与 IF 不同的语法。如上所述,特定 null 值处理的折衷方案是嵌套,这可能很难编写和理解。

null 值处理:除了指定的四个区域之外的任何非 null 区域都将被分配值 5,但 null 值将被分配 0。

注意:很多时候可以使用组获得与复杂 case 函数相同的结果。测试一个选项是否比另一个选项性能更高。

示例

CASE 函数对于实现别名等场景非常有用:

CASE LEFT(DATENAME('weekday',[Order Date]),3)
WHEN 'Sun' THEN 0
WHEN 'Mon' THEN 1
WHEN 'Tue' THEN 2
WHEN 'Wed' THEN 3
WHEN 'Thu' THEN 4
WHEN 'Fri' THEN 5
WHEN 'Sat' THEN 6
END

或者让最终用户能够在与参数(链接在新窗口中打开)一起使用时选择在图表中查看哪个度量:

CASE [Choose a Measure]
WHEN "Sales" THEN SUM([Sales])
WHEN "Profit" THEN AVG([Profit])
WHEN "Quantity" THEN COUNT([Quantity])
WHEN "Shipping Cost" THEN MEDIAN([Shipping Cost])
END

创建逻辑计算

按照下面的步骤进行操作以了解如何创建逻辑计算。

  1. 在 Tableau Desktop 中,连接到 Tableau 附带的示例 - 超市已保存数据源。
  2. 导航到工作表。
  3. 从“数据”窗格中,将“State”(州/省/市/自治区)拖到“行”功能区。
  4. 从“数据”窗格中,将“Category”(类别)拖到“行”功能区,并将其放在“State”(州/省/市/自治区)的右侧。
  5. 从“数据”窗格中,将“Sales”(销售额)拖到“列”功能区。
  6. 选择“分析”>“创建计算字段”。
  7. 在打开的计算编辑器中,执行以下操作:
    • 将计算字段命名为“KPI”。
    • 输入以下公式:
      SUM([Profit]) > 0

      此计算将快速检查某个成员是否大于零。如果大于零,则返回 true;否则返回 false。

    • 完成后,单击“确定”。
  8. 新计算字段会显示在“数据”窗格中的“度量”下。就像其他字段一样,您可以在一个或多个可视化项中使用该字段。

  9. 从“数据”窗格中,将“KPI”拖到“标记”卡上的“颜色”。

    您现在可以看到每个州/省/市/自治区的哪些类别在亏损。

    应用于条形图的逻辑函数,用于突出显示在每个州/省/市/自治区亏损的产品类别。

另请参见

显示关键进度指标

Tableau 中的函数

Tableau 函数(按类别)

Tableau 函数(按字母顺序)

感谢您的反馈!您的反馈已成功提交。谢谢!