Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据字段是否为空,使用CASE语句连接ON子句?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 根据字段是否为空,使用CASE语句连接ON子句?

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

我正在尝试对具有两个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 = 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)