Sql 根据字段是否为空,使用CASE语句连接ON子句?
我正在尝试对具有两个ID的表进行简单的左连接-基本上是一个ID和一个子ID。每行都有一个ID,但不一定有一个子ID。当存在子ID时,如果不在ID上连接,我希望基于此进行连接。我会想象这样的情况Sql 根据字段是否为空,使用CASE语句连接ON子句?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试对具有两个ID的表进行简单的左连接-基本上是一个ID和一个子ID。每行都有一个ID,但不一定有一个子ID。当存在子ID时,如果不在ID上连接,我希望基于此进行连接。我会想象这样的情况 SELECT ... FROM tablename a LEFT JOIN tablename b ON CASE WHEN SUB_ID IS NOT NULL THEN a.SUB_ID = b.SUB_ID ELSE a.ID = b.ID END AND a.otherfield
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON CASE WHEN SUB_ID IS NOT NULL THEN
a.SUB_ID = b.SUB_ID
ELSE
a.ID = b.ID END
AND
a.otherfield = b.otherfield
但我无法让任何类似的东西正常工作,所以我不得不用一个联合进行两次查询,一个在SUB_ID不为NULL的情况下连接,另一个在SUB_ID为NULL的情况下连接。它奏效了,但我无法想象没有办法做到这一点。如果有帮助,我的ID和SUB_ID值如下所示:
ID SUB_ID
10000 NULL
10001 NULL
10001 10001-3
10001 10001-5
10014 NULL
SELECT *
FROM TABLENAME A
LEFT JOIN TABLENAME B
ON (A.SUB_ID IS NOT NULL AND A.SUB_ID = B.SUB_ID)
OR (A.SUB_ID IS NULL AND A.ID = B.ID)
关于如何在没有工会的情况下实现这一点,有什么建议吗?提前谢谢 这应该适合你
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON ((b.SUB_ID IS NOT NULL AND a.SUB_ID = b.SUB_ID) OR
(a.ID = b.ID))
AND a.otherfield = b.otherfield
这应该对你有用
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON ((b.SUB_ID IS NOT NULL AND a.SUB_ID = b.SUB_ID) OR
(a.ID = b.ID))
AND a.otherfield = b.otherfield
您可以加入表两次:
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON a.SUB_ID = b.SUB_ID
AND a.otherfield = b.otherfield
LEFT JOIN tablename c
ON a.ID = b.ID
AND a.SUB_ID IS NULL
AND a.otherfield = c.otherfield
然后使用ISNULL获取列,例如
ColumnName = ISNULL(b.ColumnName, c.ColumnName)
这取决于您的索引,但我怀疑这可能比使用条件联接子句更好。您可以两次联接表:
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON a.SUB_ID = b.SUB_ID
AND a.otherfield = b.otherfield
LEFT JOIN tablename c
ON a.ID = b.ID
AND a.SUB_ID IS NULL
AND a.otherfield = c.otherfield
然后使用ISNULL获取列,例如
ColumnName = ISNULL(b.ColumnName, c.ColumnName)
这取决于您的索引,但我怀疑这可能比使用条件连接子句更好。有趣
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON (
a.SUB_ID = b.SUB_ID
OR (a.SUB_ID IS NULL AND b.SUB_ID IS NULL AND a.ID = b.ID)
)
AND a.otherfield = b.otherfield
这很可能奏效。不过不会很快
根据数据的状态和希望实现的目标,您可能希望将join子句更改为
ON (
a.SUB_ID = b.SUB_ID
OR (a.SUB_ID IS NULL AND a.ID = b.ID)
OR (b.SUB_ID IS NULL AND a.ID = b.ID)
)
AND a.otherfield = b.otherfield
。。。相反 有趣
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON (
a.SUB_ID = b.SUB_ID
OR (a.SUB_ID IS NULL AND b.SUB_ID IS NULL AND a.ID = b.ID)
)
AND a.otherfield = b.otherfield
这很可能奏效。不过不会很快
根据数据的状态和希望实现的目标,您可能希望将join子句更改为
ON (
a.SUB_ID = b.SUB_ID
OR (a.SUB_ID IS NULL AND a.ID = b.ID)
OR (b.SUB_ID IS NULL AND a.ID = b.ID)
)
AND a.otherfield = b.otherfield
。。。相反 为此,我们可以使用COALESCE:
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON COALESCE(a.SUB_ID,a.ID) = COALESCE(b.SUB_ID,b.ID)
COALESCE返回左侧第一个NOTNULL参数的值
以下是代码,我们可以使用COALESCE实现此目的:
SELECT ...
FROM tablename a
LEFT JOIN tablename b
ON COALESCE(a.SUB_ID,a.ID) = COALESCE(b.SUB_ID,b.ID)
COALESCE返回左侧第一个NOTNULL参数的值
下面是代码,请尝试以下操作:
ID SUB_ID
10000 NULL
10001 NULL
10001 10001-3
10001 10001-5
10014 NULL
SELECT *
FROM TABLENAME A
LEFT JOIN TABLENAME B
ON (A.SUB_ID IS NOT NULL AND A.SUB_ID = B.SUB_ID)
OR (A.SUB_ID IS NULL AND A.ID = B.ID)
试着这样做:
ID SUB_ID
10000 NULL
10001 NULL
10001 10001-3
10001 10001-5
10014 NULL
SELECT *
FROM TABLENAME A
LEFT JOIN TABLENAME B
ON (A.SUB_ID IS NOT NULL AND A.SUB_ID = B.SUB_ID)
OR (A.SUB_ID IS NULL AND A.ID = B.ID)