SQL左联接,其中where子句返回空值

时间:2018-07-30 10:36:06

标签: sql sql-server join null where

我有一个似乎无法修复的Join问题,这是代码的简化版本

SELECT top 5
a.Name00,
b.MIDNumber

FROM
[CM_UOC].[dbo].[Computer_System_DATA] AS a

LEFT OUTER JOIN
[UoC_Inventory].[dbo].[Inv_DATA] AS b on b.MIDNumber like '%'+a.Name00+'%'

基本上ID是相同的,但是a.Name00中的某些ID带有前导或尾随字符,例如“ AVMID ..”。找到并结合了基于这些条目的所有匹配项,但返回了从表'b'中选择的任何列为NULL。如果没有前导或尾随字符,则联接很好。

我得到的是

Name00      MIDNumber
AVMID014253 NULL
AVMID10059  NULL
AVMID10061  NULL
AVMID10063  NULL
AVMID10064  NULL

我需要的是

Name00      MIDNumber
AVMID014253 MID14253
AVMID10059  MID10059
AVMID10061  MID10061
AVMID10063  MID10063
AVMID10064  MID10064

我知道,如果没有匹配项,则LEFT JOIN将返回空值,但是我如何才能加入并获取所需的输出?

编辑

以此固定了主角

WITH A AS
(
SELECT 'M'+right(Name00, len(Name00) - charindex('M', Name00)) as 'A_MID'
FROM [CM_UOC].[dbo].[Computer_System_DATA]
),
B AS
(
SELECT MIDNumber AS 'B_MID'
FROM [UoC_Inventory].[dbo].[Inv_DATA]
)
SELECT * FROM A LEFT JOIN B ON (B.B_MID = A.A_MID)

WHERE B.B_MID IS NOT NULL
ORDER BY A_MID DESC

在修剪任何前导字符时仍然遇到问题

1 个答案:

答案 0 :(得分:2)

在这种情况下,您可以使用 CHARINDEX 函数:

SELECT top 5 a.Name00,
             b.MIDNumber
FROM [CM_UOC].[dbo].[Computer_System_DATA] AS a
   LEFT OUTER JOIN [UoC_Inventory].[dbo].[Inv_DATA] AS b 
                on CHARINDEX(b.MIDNumber,a.Name00) > 0