从未填充的表中选择 - IS NULL 不起作用

Posted

技术标签:

【中文标题】从未填充的表中选择 - IS NULL 不起作用【英文标题】:select from unpopulated table - IS NULL does not work 【发布时间】:2014-09-12 21:47:28 【问题描述】:

SQL、甲骨文—— 如果 Status = 'SO' 或 Status 为 Null,我正在尝试从表中提取记录。 我只能在 Status = 'SO' 的情况下检索记录,因为如果它是 Null,则意味着我要从中提取的地方无人居住 - 那里没有任何东西可以查看。这几乎就像是让某人告诉他们是否在书中找到了空白页,但既然是空白页,就真的没有页面可看,但书仍然存在。如果页面上有“SO”,您可以找到它。

DGMR_DEGS_CODE 可以是 PN、AW、SO 或空白(不存在)

Select distinct sp.sprite_id as "ID", SP.SPRITE_LAST_NAME as "Last", SP.SPRITE_FIRST_NAME as "First", 
sh.TRAN_REQUEST_DATE as "Request Date",
NL.DGMR_DEGS_CODE as "Null Dgr",
SV.RSTS_ENRL as "Enrolled?",
sf.stcr_term_code as "Term",
sysdate as "Current Date"


from Sprite SP

join TRAN SH 
on sp.sprite_pid = sh.tran_pid 

full outer join DGMR NL
on NL.DGMR_pid = sp.sprite_pid

join stcr sf
on sp.sprite_pid = sf.stcr_pid
JOIN stvrsts SV 
on SF.STCR_RSTS_CODE = SV.STVTS_CODE 

where 
Sp.sprite_change_ind is null

and sh.TRAN_REQUEST_DATE between sysdate-1 and sysdate
and (sf.stcr_term_code = '201401' or sf.stcr_term_code = '201402')
AND SV.RSTS_ENRL = 'Y'
AND (NL.DGMR_DEGS_CODE is null or NL.DGMR_DEGS_CODE = 'SO' )
--and (length(NL.DGMR_DEGS_CODE)=0 or NL.DGMR_DEGS_CODE = 'SO' )
--and NL.DGMR_DEGS_CODE <> 'PN'
--and NL.DGMR_DEGS_CODE <> 'AW'
--and NL.DGMR_DEGS_CODE <> 'PN' and NL.DGMR_DEGS_CODE <> 'AW'

如果我不包括 NL.DGMR_DEGS_CODE 的条件,它会选择 25 条记录:这些记录包括 SO、AW、PN 和 NULL 记录! 如果我包括标准,它不会拉 NULL 记录。请求 SO 或 Null 只会选择 SO 记录。

【问题讨论】:

你确定dgmr_degs_code实际上是NULL吗?而不是,比如说,一个或多个空格字符?您发布的代码没有使用 IS NULL--您的问题文本说您使用 IS NULL 返回 NULL 值。您确定您实际上在代码中使用IS NULL 吗?如果是这样,您能否编辑您的 SQL 语句以向我们展示您是如何使用它的? 我很抱歉。上面的代码没有显示“is null”,因为我试过了,但是没有用。我也试过''。那是真的吗?或者 '%' ?在 Is Null 和 ' ' 和 '%' 不起作用之后,我尝试了 (length(NL.DGMR_DEGS_CODE)=0 or NL.DGMR_DEGS_CODE = 'SO' ) “空”行之一的dump(nl.dgmr_degs_code) 返回什么?这将准确地向您显示列中存储的内容。 我不知道如何使用它。我把它放在我的代码的末尾,但我得到了一个错误。当我对它进行 desc 时,我得到了这个(如果这有帮助):名称:DGMR_DEGS_CODE,Null?:NOT NULL,类型:VARCHAR2(8) dump 是一个函数——您可以将它放在您的SELECT 子句中以查看该列中实际存储的内容。列定义防止 NULL 值,因此该列中的任何内容都不是 NULL。它是一些非 NULL 值。我们只需要弄清楚那个值是什么。 【参考方案1】:

没有人回答这个问题,所以我想为可能有类似问题的其他人提供答案。 该字段为“非空”,因此我必须进行 TRIM 才能使其为空。

我替换了最后一行。

where 
Sp.sprite_change_ind is null
and sh.TRAN_REQUEST_DATE between sysdate-1 and sysdate
and (sf.stcr_term_code = '201401' or sf.stcr_term_code = '201402')
AND SV.RSTS_ENRL = 'Y'
and trim(NL.DGMR_DEGS_CODE) is null

【讨论】:

以上是关于从未填充的表中选择 - IS NULL 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JPA Left Join IS NULL条件不起作用

SQL Null 语句不起作用 MS Access

从 id 不在 id 列表中的表中选择

IF(a.testcol IS NULL,'',a.testcol) IS NOT NULL 不起作用

MYSQL 从存储过程中的临时表中选择 JOIN 不起作用

Ajax/Json MVC 表填充不起作用