我需要创建一个查询来收集列A
的所有行,这些行不为null且不为空。
当我使用这个时:
AND A.EXP_GRAD_TERM is not null AND A.EXP_GRAD_TERM <> ' '
我得到了1169条记录,这些记录都具有该字段的某些值。
但是当我使用这个时:
AND LTRIM(RTRIM(A.EXP_GRAD_TERM)) is not null
我得到了1932条记录。它们具有带值的行和带空格的行。我什至转换了该列,该列仅包含空格或值,没有其他奇怪的不可见字符。
我不知道为什么。我认为他们应该以相同的方式工作。
有什么想法吗?
答案 0 :(得分:2)
LTRIM()函数:
在删除前导空格后返回字符表达式。
RTRIM()函数:
截断所有尾随空格后返回一个字符串。
它们不同于IsNull或空字符串条件(CASE WHEN IS NULL OR <>'')
参考
答案 1 :(得分:2)
此表达式:
LTRIM(RTRIM(A.EXP_GRAD_TERM)) is not null
完全等同于:
A.EXP_GRAD_TERM is not null
空字符串与NULL
不同,因此,即使从仅包含空格的字符串中删除空格,也不会影响NULL
比较。
如果您感到困惑,也许您有使用Oracle的经验,其中空字符串和NULL
是同一回事。这是Oracle的特有属性。
答案 2 :(得分:0)
用COALESCE()
和LTRIM()
组合RTRIM()
:
AND RTRIM(LTRIM(COALESCE(A.EXP_GRAD_TERM, ''))) <> ''
COALESCE(A.EXP_GRAD_TERM, '')
将为每个''
值返回null
。
答案 3 :(得分:0)
查看是否要获取不为null且不为空的值,可以使用isull(exp,replace_value)
AND RTRIM(LTRIM(ISNULL(A.EXP_GRAD_TERM, ''))) <> ''
isnull
isull替换您要替换的空值。您还可以使用COALESCE
,它“返回参数中的第一个非空表达式”
COALESCE
优于ISNULL
的一个明显优势是它支持两个以上的输入,而ISNULL仅支持两个。 COALESCE的另一个优点是它是一个标准函数(即由ISO / ANSI SQL标准定义),而ISNULL是T-SQL特定的。这两个功能之间的这些区别非常简单。
如果您想进一步了解ISNULL和COALESCE之间的区别,可以在this link上查看它