【问题标题】:In SQL replace null value with another value在 SQL 中用另一个值替换空值
【发布时间】:2015-07-23 11:08:15
【问题描述】:

这是我的 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'

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

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

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

【问题讨论】:

  • 你能解释一下你试图实现的输出背后的逻辑吗?这些“默认”值从何而来?
  • 在这个特定的结果集中,学生参加了考试。在上述结果中,rollno 1 的学生参加了 ExamID 28 的考试,但其余两人没有参加,但考试是强制性的。因此,ExamID、ExamName、SubjectID 字段也应该填充给那些没有参加的学生。其余两列的值为 A 表示不存在。
  • 图片出现问题。他们也变成了NULL

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


【解决方案1】:

使用 IsNULL() 函数见下例

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

【讨论】:

  • 我想我根本做不到。因为 isnull 在这种情况下用一些已知的静态值替换空字段 0 但在我的情况下,我不知道我必须用什么值替换该空字段。但我知道的是;包含 value 的字段,该值应传递给 null 字段
  • @user42392,使用ISNULL(ColumnContainedNULL, ColumnWhichReplaceNULLValue)
【解决方案2】:

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

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 函数:

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 行)。

【讨论】:

  • 好的,我会在我的查询中尝试这个。是的,我也必须展示更多的考试成绩。
  • @user42392 好的,您需要在示例数据中添加一列或多列来区分考试。另一种解决方案是按某些列对结果进行排序。您能否编辑您的问题并添加此类数据/输出?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多