如何显示消息而不是 NULL
Posted
技术标签:
【中文标题】如何显示消息而不是 NULL【英文标题】:How to display message instead of NULL 【发布时间】:2011-12-02 18:32:36 【问题描述】:我正在返回一个包含名称、课程和课程代码的查询,但如果课程代码为空,我想显示“未注册”。 我可以通过使用“默认”来做到这一点吗? 选择语句来自 VIEW 是否会有所不同。
CREATE VIEW STUDENT_LIST
(studentname, dateofbirth, coursecode)
AS
SELECT COURSECODE, STUDENTNAME, DATEOFBIRTH
FROM STUDENT;
SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,"NOT_ENROLLED")
FROM STUDENT_LIST;
我收到回复 NOT ENROLLED 无效标识符...我试过不带引号 我正在使用 oracle。
【问题讨论】:
请提供更多细节;例如,感兴趣的 select 语句会有所帮助。 还有您正在使用的 DBMS。正如@user983064 指出的那样,不同的实现具有不同的空合并功能。 您使用的是什么形式的 SQL? sql-server / mysql? 什么技术?我们是在谈论直接查询 SQL 吗?如果是,是什么类型的 SQL(MS Sql、MySql 等等)。这是其他类型的代码(.NET、Java)吗?有几种方法可以处理此要求,具体取决于您的环境。 从 Oracle 8i 开始,您可以使用 COALESCE 而不是 NVL,它是 ANSI 标准。正如其他人指出的那样,如果您使用单引号而不是双引号,则任何一个都可以工作。 【参考方案1】:SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,"NOT_ENROLLED") FROM STUDENT_LIST;
我收到回复 NOT ENROLLED 无效标识符...我试过了 没有引号,我使用的是 oracle。
这是因为您在 NOT_ENROLLED 周围使用了双引号。在 Oracle 中,您在字符串文字周围使用单引号。双引号分隔可能包含嵌入空格的标识符,因此 Oracle 认为 NOT_ENROLLED 是标识符,而不是字符串文字。
使用这个:
SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,'NOT_ENROLLED') FROM STUDENT_LIST;
【讨论】:
好的,谢谢,但是当我交换 select 语句的顺序时,列名与列不匹配所有列也交换轮次(大声笑)我试图复制我开始的顺序视图。【参考方案2】:ORACLE 有NVL()
SQL Server 有ISNULL()
MySQL 有IFNULL()
以上所有和 PostgreSQL 都支持COALESCE()
。
所以,
SELECT STUDENTNAME,
DATEOFBIRTH,
NVL(COURSECODE,'NOT_ENROLLED')
FROM STUDENT_LIST;
或
SELECT STUDENTNAME,
DATEOFBIRTH,
COALESCE(COURSECODE,'NOT_ENROLLED')
FROM STUDENT_LIST;
在甲骨文中。
【讨论】:
每次我运行 SELECT DATEOFBIRTH, COURSECODE, STUDENTNAME THE FIELDS IN THE TABLE ALL SWAP ROUND,dateofbirth 超过名称, coursecode 超过日期,studentname 超过代码。 @StudentRik 这听起来很奇怪,您的意思是它们在您的结果中显示的顺序与您选择的顺序不同吗? 我可以像普通表一样删除视图表并重试吗? @StudentRik 是的,除了语法应该是 drop view ... 。【参考方案3】:使用 nvl。不同的实现可能会有所不同,例如对于 MySQL,您需要 ifnull。
【讨论】:
是的,我想过。谢谢会试试的。【参考方案4】:如果您使用的是 mySql,那么可以!您可以为 NULL 设置一个默认值。并且每当一个值是 none 时,该值将保存在数据库中。
【讨论】:
【参考方案5】:为避免 NOT ENROLLED 无效标识符回复,您应该将双引号替换为单引号:
替换:
SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,"NOT_ENROLLED")
FROM STUDENT_LIST;
作者:
SELECT STUDENTNAME, DATEOFBIRTH, NVL(COURSECODE,'NOT_ENROLLED')
FROM STUDENT_LIST;
对于 Oracle,双引号用于列或表标识符(例如,包含空格:“total items”)
【讨论】:
【参考方案6】:这里没有涉及的问题的一个方面是,我们只考虑了在表格的字符字段中输入文本“显示消息”的一般场景。
如果它是一个不同的数字字段,例如 DOB... 在这种情况下,我们将使用 to_char 并保存该字段,否则我们将收到无效输入错误
SELECT e.studentname, NVL(TO_CHAR(e.dateofbirth),'PLS Contact admin to update'), NVL(e.COURSECODE,'NOT_ENROLLED')
FROM STUDENT_LIST e;
这会将文本保存到数字字段中,否则会导致错误。
【讨论】:
以上是关于如何显示消息而不是 NULL的主要内容,如果未能解决你的问题,请参考以下文章