我如何安排sql的大小写表达式在正确的格式,因为我得到错误。我试图使一个条件,如果字段的离开日期不是空显示左,否则显示活动
SELECT DISTINCT
PEO.PEOPLE_ID AS [PEOPLE_ID]
,PEO.EMPLOYEECLOCKNO AS [EMPLOYEENUMBER]
,ISNULL(CONVERT(VARCHAR(50),PEO.DATEOFJOIN,103),'') AS [DATEOFJOIN]
--,ISNULL(PEO.DISPLAYSTATUS,'') AS [DISPLAYSTATUS]
,CASE
When ISNULL(PEO.STATUS,'' ) = 'A'
Then 'ACTIVE'
ELSE 'LEFT' WHERE PEO.DATEOFLEAVING <> NULL
END as [STATUS]
INTO #BSP_EMPLOYEEDETAILS
谢谢你的帮助。
我试图使一个条件,如果字段的离开日期不是空显示左,否则显示活动
CASE WHEN PEO.DATEOFLEAVING IS NULL THEN 'ACTIVE' ELSE 'LEFT' END
(我更喜欢让布尔检查积极的感觉而不是消极的感觉,但如果你想要它是消极的…)
CASE WHEN PEO.DATEOFLEAVING IS NOT NULL THEN 'LEFT' ELSE 'ACTIVE' END
注意蜜獾的评论;您应该只使用IS NULL
或IS NOT NULL
来比较null - null右操作数与任何非is操作符的结果为null:
NULL IS NULL --true
NULL IS NOT NULL --false
NULL = NULL --null, which eventually will (probably) be processed as false
NULL <> NULL --null, which eventually will (probably) be processed as false
NULL != NULL --null, which eventually will (probably) be processed as false
NOT(NULL = NULL) --null, which eventually will (probably) be processed as false
我说"最终"因为这很重要;零差价。如果你看最后一个例子,NULL=NULL
是NULL
,然后变成NOT(NULL)
,也是NULL
。如果NULL=NULL
瞬间变成了FALSE
,那么NOT(NULL=NULL)
就变成了NOT(FALSE)
,也就是TRUE
。事实上,null在整个操作集合中扩散,在末尾弹出,然后被解释为false,这可能是有利的,但始终应该注意…
当然,如果接收它的东西是用于处理NULL,如COALESCE(NOT(NULL=NULL), 'it was null')
,那么它将接收一个NULL(在这种情况下会输出'it was null'
),但通常当你在布尔上下文(如CASE WHEN NOT(mycolumn=NULL) THEN...
或WHERE NOT(mycolumn=NULL)
)中使用它时,它会变成NULL,并按情况接收/在哪里并解释为false
。
NOT(NULL=NULL)
的例子,但如果你想尝试一下你的知识,MySQL更宽容,它允许这样的查询:
select case when (NOT(x = NULL)) IS NULL THEN 't' ELSE 'f' end
from (select null as x)y
select case when (NOT(x = NULL)) IS UNKNOWN THEN 't' ELSE 'f' end
from (select null as x)y
SQLServer希望您更快地做出null决定,并且不允许您在它可以看到已变为null/unknown的东西上胡闹
关于UNKNOWN的脚注;它通常被(甚至在规范中)视为布尔NULL的同义词——在真值表的意义上,它被称为三态布尔逻辑中的第三个值,但如果数据库支持将UNKNOWN作为关键字,则通常可以互换使用。就我个人而言,我喜欢少记一件事;你可以学习NULL的行为,并通过应用这些简单的规则来实现逻辑上一致的结果:IS NULL, IS NOT NULL,其他任何东西都变成NULL,然后使它接触到的所有东西都为空