首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL中,用另一个值替换NULL值

在SQL中,用另一个值替换NULL值
EN

Stack Overflow用户
提问于 2015-07-23 19:08:16
回答 2查看 1.4K关注 0票数 1

下面是我的SQL查询

代码语言:javascript
运行
复制
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'

这将产生如图所示的结果:

但是我想要这样的结果,因为那两个学生没有参加考试

类似地,如果三个学生中的任何一个存在另一个考试,并且其他学生缺席,则应重复相同的过程

EN

回答 2

Stack Overflow用户

发布于 2015-07-23 19:27:27

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

代码语言:javascript
运行
复制
Declare @variable varchar(MAX)
set @variable = NULL
select IsNULL(@variable,0) as A

票数 1
EN

Stack Overflow用户

发布于 2015-07-23 19:34:40

让我们有以下示例数据(它类似于您的示例数据,只是插入到一个表中):

代码语言:javascript
运行
复制
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;

因此,我假设我们这里只有一项检查的详细信息,问题是如何使用现有值替换ExamIDExamNameSubjectID列的NULL值。

解决方案是使用带有OVER子句的MAX函数:

代码语言:javascript
运行
复制
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;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31585603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档