基于非穷举查找的T-SQL返回更正列

时间:2014-09-01 12:33:30

标签: sql sql-server tsql

请原谅我认为应该是一个相当简单的问题,但我很难找到其他相同条件的问题。

我有一个SQL Server数据库表,其中包含WorkplaceName列(nvarchar),此列有许多不同的可能性,来自不同的源系统,并且无法在上游更改。

MainDataTable

的select语句中看到的结果示例
 WorkplaceName | Value
 ---------------------
 ID1234        | 54
 ID9876        | 99
 ID 2345       | 76

几乎所有这些条目都是正确的,但是,有少量条目是不正确的,并且出于下游数据操作的目的,我需要根据非详尽的查找表来纠正这些位置中的少数几个

我们假设'ID 2345'形成错误,应该是ID2345。

我有一个名为WorkplaceLookups的查找表,它只包含已知错误的条目以及更正的输出:

 WorkplaceNameReference | WorkplaceNameLookup
 ----------------------------------------------
 'ID 2345'              |  'ID2345'

因此,如果正确形成的Workplace(不在查找列表中),我想返回原始值;如果存在格式错误的Workplace,则应使用查找中的值进行更正。

使用SQL-ish伪代码,这或多或少是我正在尝试做的事情:

SELECT 
   CASE 
     WHEN [MainDataTable].[WorkplaceName] IN [WorkplaceLookups].[WorkplaceNameReference]
      THEN [WorkplaceLookups].[WorkplaceNameLookup]
      ELSE [MainDataTable].[WorkplaceName]
   END AS [WorkplaceNameCorrected],
   [Value]
FROM 
   MainDataTable

我应该怎么做?如果可能的话,我想避免任何函数或存储过程,但如果唯一的解决方案就是使用它,那就这样吧。

非常感谢任何反馈。

非常感谢, 布赖恩

2 个答案:

答案 0 :(得分:1)

使用left outer joincoalesce()

SELECT COALESCE(wl.WorkplaceNameLookup, mdt.WorkplaceName) as WorkplaceNameCorrected,
       Value
FROM MainDataTable mdt LEFT JOIN
     WorkplaceLookups wl
     ON mdt.WorkplaceName = wl.WorkPlaceNameReference;

答案 1 :(得分:0)

SELECT IsNull(m.WorkplaceNameLookup, l.WorkplaceName) as WorkplaceName, Value
FROM MainDataTable m LEFT JOIN
 WorkplaceLookups l ON m.WorkplaceName = l.WorkPlaceNameReference

希望这会对你有所帮助。