[a] = [b] is true when the values are equal and null when either is missing. On extracts and files, text compares without regard to case: West = west is true. DuckDB's = is case sensitive, so lower both sides. IS NOT DISTINCT FROM is not a safer =: it turns the nulls into false.
Updated · Checked on the xmetric engine
What is the syntax?
a = b
a, b
two values of the same kind: numbers, strings, dates or booleans.
Returns true, false, or null when either side is null.
What does it return, and what is the SQL?
Each example runs on the same 8 sample rows twice: the Tableau formula on the xmetric engine, and the SQL in DuckDB.
Which rows pass a = b?
Tableau
[a]=[b]
SQL (DuckDB)
SELECT a = b AS result
FROM input
ORDERBY id
No pair is equal; rows 6 and 7 are null because a value is missing.
a
b
Result
7
2
false
−7
2
false
2
5
false
9
4
false
5
3
false
2
null
1
null
−3
−2
false
✓ The Tableau formula and the SQL return the same 8 rows.
How does = compare two text fields?
Tableau
[s]=[t]
SQL (DuckDB)
SELECTlower(s) =lower(t) AS result
FROM input
ORDERBY id
Case is ignored, so row 1 (West, west) compares as equal text.
s
t
Result
West
west
true
East
North
false
North
North
true
south
East
false
East
null
West
null
East
South
false
east
east
true
✓ The Tableau formula and the SQL return the same 8 rows.
Where does a straight translation go wrong?
Common mistake
Why does s = t say West and west differ?
Tableau's default collation on extracts and files ignores case, so West and west (row 1) compare as equal. DuckDB compares the bytes. Lower both sides.
Tableau
[s]=[t]
Tempting SQL
SELECT s = t AS result
FROM input
ORDERBY id
SQL that matches
SELECTlower(s) =lower(t) AS result
FROM input
ORDERBY id
s
t
Tableau
Tempting SQL
SQL that matches
West
west
true
false
true
East
North
false
false
false
North
North
true
true
true
south
East
false
false
false
East
null
null
null
West
null
null
null
East
South
false
false
false
east
east
true
true
true
✓ The SQL that matches returns the Tableau result on every row; the marked cells are where the tempting SQL differs.
Common mistake
Why does IS NOT DISTINCT FROM return false for missing values?
It is a null-safe comparison: null versus 2 is false. Tableau returns null, which a filter treats differently from false in counts and IIF.
Tableau
[a]=[b]
Tempting SQL
SELECT a ISNOTDISTINCTFROM b AS result
FROM input
ORDERBY id
SQL that matches
SELECT a = b AS result
FROM input
ORDERBY id
a
b
Tableau
Tempting SQL
SQL that matches
7
2
false
false
false
−7
2
false
false
false
2
5
false
false
false
9
4
false
false
false
5
3
false
false
false
2
null
false
null
1
null
false
null
−3
−2
false
false
false
✓ The SQL that matches returns the Tableau result on every row; the marked cells are where the tempting SQL differs.
How do I write it in Snowflake or BigQuery?
The first example, written for each warehouse from its documentation. These are not run here; DuckDB is.
Snowflake
SELECTLOWER(s) =LOWER(t) AS result
FROM input
ORDERBY id
The comparison returns null, not false, in Tableau and in SQL. A filter drops those rows, and IIF returns null for them.
Is the string comparison case sensitive?
On an extract or a file source, no: Tableau's default string collation ignores case, so West and west compare as equal. On a live connection the database's collation decides. DuckDB compares case sensitively, so lower both sides to match an extract.