Sql 连接a、b和c上的t1,但如果c不为null,则仅连接c上的t1

Sql 连接a、b和c上的t1,但如果c不为null,则仅连接c上的t1,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想要下面的一些t-sql语法正确的版本(希望下面的内容是人类可读的) 或者,如果T2.c永远不能为NULL: SELECT T1.my_column, T2.my_other_column FROM Table1 T1 INNER JOIN Table2 T2 ON T2.a = T1.a AND T2.b = T1.b AND T2.c = COALESCE(T1.c, T2.c) 由于可读性,无论如何我都喜欢第一个 编辑: COALESCE

我想要下面的一些t-sql语法正确的版本(希望下面的内容是人类可读的)

或者,如果T2.c永远不能为
NULL

SELECT
    T1.my_column,
    T2.my_other_column
FROM
    Table1 T1
INNER JOIN Table2 T2 ON
    T2.a = T1.a AND
    T2.b = T1.b AND
    T2.c = COALESCE(T1.c, T2.c)
由于可读性,无论如何我都喜欢第一个

编辑:
COALESCE
返回传入函数的第一个非空参数。因此,如果上面
T1.c
NULL
,它将返回
T2.c
。如果
T2.c
也是
NULL
,那么它将尝试计算
NULL=NULL
,这将是false

您可以通过执行
COALESCE(T2.c,-1)=COALESCE(T1.c,T2.c,-1)
来解决这个问题,但是SQL不能很好地使用索引

如果您想在它们都是
NULL
的情况下
JOIN
,那么您可以使用上面的位,或者只是拼写出每个可能的组合:

(
    (T2.c IS NULL AND T1.c IS NULL) OR
    T2.c = T1.c
)
或者,如果T2.c永远不能为
NULL

SELECT
    T1.my_column,
    T2.my_other_column
FROM
    Table1 T1
INNER JOIN Table2 T2 ON
    T2.a = T1.a AND
    T2.b = T1.b AND
    T2.c = COALESCE(T1.c, T2.c)
由于可读性,无论如何我都喜欢第一个

编辑:
COALESCE
返回传入函数的第一个非空参数。因此,如果上面
T1.c
NULL
,它将返回
T2.c
。如果
T2.c
也是
NULL
,那么它将尝试计算
NULL=NULL
,这将是false

您可以通过执行
COALESCE(T2.c,-1)=COALESCE(T1.c,T2.c,-1)
来解决这个问题,但是SQL不能很好地使用索引

如果您想在它们都是
NULL
的情况下
JOIN
,那么您可以使用上面的位,或者只是拼写出每个可能的组合:

(
    (T2.c IS NULL AND T1.c IS NULL) OR
    T2.c = T1.c
)
用这个

select* from table1
join table2 
on table1.a = table2.a
and table1.b = table2.b
and (table1.c is not null or table1.c = table2.c)
用这个

select* from table1
join table2 
on table1.a = table2.a
and table1.b = table2.b
and (table1.c is not null or table1.c = table2.c)

通常能提供更好性能的技巧

SELECT
    T1.my_column,
    T2.my_other_column
FROM
    Table1 T1
JOIN Table2 T2 
  ON T2.a = T1.a 
 AND T2.b = T1.b 
 AND T2.c = isnull(T1.c, T2.c)

通常能提供更好性能的技巧

SELECT
    T1.my_column,
    T2.my_other_column
FROM
    Table1 T1
JOIN Table2 T2 
  ON T2.a = T1.a 
 AND T2.b = T1.b 
 AND T2.c = isnull(T1.c, T2.c)

虽然我不确定coalesce在做什么(如果不匹配,我假设检查null?),但它工作得很好。接下来,我将如何在t1.c上加入t2.c,它们都为null?我知道我不能在null上加入,但这对于我正在进行的异常数据迁移非常有用。我已经对答案添加了一些解释,而不是试图将其全部放在注释中。这非常有效,尽管我不确定coalesce正在做什么(如果不匹配,我假设检查null?)。接下来,我将如何在t1.c上加入t2.c,它们都为null?我知道我不能在null上加入,但这对于我正在进行的不寻常的数据迁移非常有用。我已经为答案添加了一些解释,而不是试图将其全部放在注释中。