逻辑函数

本文介绍 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。”

说明

通常与 IFIIF 一起使用。另请参见 NOT或者

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

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

注意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。”

说明

另请参见 IFIIF

WHENTHENELSEEND 结合使用。

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

ELSE

语法CASE <expression>
WHEN <value1> THEN <then1>
WHEN <value2> THEN <then2>
...
[ELSE <default>]
END
定义IFCASE 表达式的一个可选部分,用于指定如果没有一个测试表达式为 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
说明

CASEWHENIFELSEIFTHENEND 一起使用

ELSE 对于 CASEIF 是可选的。在计算中,其中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
说明

IFTHENELSEEND 一起使用

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

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

END

定义用于结束一个 IFCASE 表达式。
示例
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。”

说明

CASEWHENIFELSEIFTHENELSE 一起使用。

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。”

说明

另请参见 IFIIF

ELSEIFTHENELSEEND 一起使用

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。”

说明

另请参见 IFCASE

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。”

说明

通常与 IFIIF 一起使用。另请参见 AND或者

或者

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

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

说明

通常与 IFIIF 一起使用。另请参见 ANDNOT

如果任一表达式为 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
定义IFELSEIFCASE表达式的必需部分,用于定义如果特定值或测试为 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。”

说明

CASEWHENIFELSEIFTHENELSEEND 一起使用

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。”

说明

CASETHENELSEEND 一起使用。

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。”

说明

ZNIFNULL 的特殊情况,其中如果表达式为 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 函数(按字母顺序)

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