SQL Query从另一个表中提取数据IF NULL

时间:2017-10-13 20:56:10

标签: sql sql-server tsql

我有一个运行SQL Server Express数据库的系统,我需要从中提取一些数据。我已经创建了基本的SQL查询,但我发现有些数据位于其他地方。

基本前提是我有一个维修订单,车辆和客户的数据库。车辆通常通过VIN解码器添加,因此它们具有来自MAKE和MODEL表的ID。但是,在VIN不解码的情况下,应用程序允许用户手动输入该信息,然后将其存储在另一个名为“UserVehicleAttributes”的表中。在此表中有VehicleID,AttributeName和&的AttributeValue。

UserAttributeId  VehicleId  AttributeName   AttributeValue
-----------------------------------------------------------
364                 6829        Model           Sedona
365                 6830        Make            Kia 
366                 6830        Model           Sedona

所以我需要的是如果Make或Model从Vehicle表中显示为NULL,我可以显示手动输入的内容。

我发现数据库中存在一个看起来能够做我需要的功能,但我不知道如何在查询中使用它。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [SM].[fnVehicleModelName]()
RETURNS TABLE 
AS
RETURN 
(
	 SELECT DISTINCT v.VehicleId, 
		  CASE
			  WHEN v.SubModelId IS NULL THEN ISNULL(ua.[AttributeValue],'')
			  ELSE smm.[Name]
		   END as Model
	 FROM SM.Vehicle v (NOLOCK)
	 LEFT OUTER JOIN  
         (SELECT sm.SubModelId, m.[Name] + ' ' + sm.[Name] as Name 
                 FROM DMV.SubModel (NOLOCK) sm  
					 INNER JOIN  DMV.Model  m (NOLOCK) 
							ON sm.ModelId = m.ModelId ) as smm
           ON v.SubModelId = smm.SubModelId               
     LEFT OUTER JOIN  SM.UserVehicleAttributes ua (NOLOCK)--
   			ON v.VehicleId = ua.VehicleId and ua.AttributeName = 'Model' 

非常感谢任何帮助。我对SQL(显然)并不是很了解,但我想把它弄清楚。

2 个答案:

答案 0 :(得分:0)

我不确定你为什么要把它变成没有参数的函数 - 这与视图有点相同。考虑在这里使用视图是否可以简化情况。

你是错的,你想在这里使用ISNULL,但我认为连接应该更简单。您的情况基本上是“从任何具有非空值的表中提取列值,首先优先选择一个表”

在外部联接中,如果没有匹配项,外部联接表中的所有列都将为null,如果匹配,则应填写所有值。知道...您应该能够做这样的事情......(作为一个例子,澄清这个概念是如何工作的,而不是为你解决问题)

select v.VehicleId,
   VehicleName = isnull(Model.Name, UserVehicle.Name)
from Vehicle v
left outer join Model on Model.VehicleID = Vehicle.VehicleID
left outer join UserVehicle on UserVehicle.VehicleID = Vehicle.VehicleId

因此,它的作用是从任一表中连接可能的行,并且ISNULL宏选择任何非空值。对其余的列执行此操作,并根据您的条件修复连接条件,您应该是金色的。

答案 1 :(得分:0)

该函数没有参数,如果你想使用它将其重写为视图,但它只显示模型,所以你可以使用这样的子查询:

SELECT
  VehicleId,
  CASE
  WHEN Make IS NULL
  THEN ( SELECT AttributeValue FROM UserVehicleAttributes
        WHERE VehicleId = Vehicles.VehicleId
        AND AttributeName = 'Make' )
  ELSE Make
  END AS Make,
  CASE
  WHEN Model IS NULL
  THEN ( SELECT AttributeValue FROM UserVehicleAttributes
        WHERE VehicleId = Vehicles.VehicleId
        AND AttributeName = 'Model' )
  ELSE Model
  END AS Model
FROM
  Vehicles