在SQL中,将null值替换为另一个值

时间:2015-07-23 11:08:16

标签: sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012

这是我的SQL查询

SELECT p.StudentID, ai.RollNo, p.FirstName, p.MiddleName, p.LastName, 
om.ExamID,  et.ExamName, om.SubjectID,
ISNULL(CONVERT(varchar(20),om.ObtainedMarksTheory), 'A') as 'ObtainedMarksTheory', 
ISNULL(CONVERT(varchar(20),om.ObtainedPracticalMarks),'A') as 'ObtainedPracticalMarks'
FROM Students.PersonalInfo p
INNER JOIN Students.AcademicCourse ac on p.StudentID = ac.StudentID
INNER JOIN Students.AcademicInfo ai on p.StudentID=ai.StudentID
LEFT OUTER JOIN Exam.ObtainedMarkEntry om on p.StudentID = om.StudentID
LEFT JOIN Exam.ExamType et   on om.ExamID = et.ExamID
WHERE ai.BatchID = '103' AND ai.SemesterID = '21' and ac.Section = '8'

这产生的结果如图所示:

但我想要这样的结果,因为那两名学生在考试中缺席

同样,如果三名学生中任何一名学生确实存在另一名考试而其他考试不存在,则应重复相同的程序

2 个答案:

答案 0 :(得分:1)

使用IsNULL()函数见下面的例子

Declare @variable varchar(MAX)
set @variable = NULL
select IsNULL(@variable,0) as A

enter image description here

答案 1 :(得分:0)

让我们有以下示例数据(就像您的示例数据,只是插入一个表中):

DECLARE @DataSource TABLE
(
    [StudentID] TINYINT
   ,[RowNo] TINYINT
   ,[FirstName] VARCHAR(12)
   ,[MiddleName] VARCHAR(12)
   ,[LastName] VARCHAR(12)
   ,[ExamID] TINYINT
   ,[ExamName] VARCHAR(18)
   ,[SubjectID] TINYINT
   ,[ObtainedMarksTheory] VARCHAR(12)
   ,[ObtainedPracticalMarks] VARCHAR(12)
);

INSERT INTO @DataSource ([StudentID], [RowNo], [FirstName], [MiddleName], [LastName], [ExamID], [ExamName], [SubjectID], [ObtainedMarksTheory], [ObtainedPracticalMarks])
VALUES (101, 1, 'FN_A', 'MN_A', 'LN_A', NULL, NULL, NULL, 'A', 'A')
      ,(102, 2, 'FN_B', 'MN_B', 'LN_B', 28, 'First Tem2072', 97, '74.00', '56.00')
      ,(103, 3, 'FN_C', 'MN_C', 'LN_C', NULL, NULL, NULL, 'A', 'A');

SELECT *
FROM @DataSource;

enter image description here

所以,我想我们这里只有一个考试的详细信息,问题是如何使用NULLExamIDExamName列替换SubjectID值现有的价值观。

解决方案是将MAX函数与OVER子句一起使用:

SELECT [StudentID]
      ,[RowNo]
      ,[FirstName]
      ,[MiddleName]
      ,[LastName]
      ,MAX([ExamID]) OVER() AS [ExamID]
      ,MAX([ExamName]) OVER() AS [ExamName]
      ,MAX([SubjectID]) OVER() AS [SubjectID]
      ,[ObtainedMarksTheory]
      ,[ObtainedPracticalMarks]
FROM @DataSource;

enter image description here

请注意,最好使用OVER子句,因为您不会在初始查询中添加GROUP BY子句。此外,如果您有更多考试的详细信息,可以使用PARTITION BY子句(如果您有一些列来区分每次考试的NULL行)。