【问题标题】:Oracle - Get non empty valuesOracle - 获取非空值
【发布时间】:2014-06-17 04:43:33
【问题描述】:

我想从列值不为空的表中获取记录。

假设以下数据点

**my_table (table_name)**

**my_column(column_name)**
abc
def
null

xyz

所以我想查找不为空或不为空的记录。基本上我的输出必须是

abc
def
xyz

我尝试的是

select * from my_table where my_column!=null & my_column!='';

返回 0 条记录

所以我尝试四处搜索,发现 Oracle 将空白字符串视为 null 并使用以下查询

select * from my_table where trim(my_column) is not null;

这返回了我所有的结果,除了记录具有空值。

我什至希望空字符串从结果中消失。我尝试了上面所有可能的组合,但没有得到想要的结果。

【问题讨论】:

    标签: oracle oracle10g oracle-sqldeveloper


    【解决方案1】:

    假设my_columnVARCHAR2,听起来你只是想要

    SELECT *
      FROM my_table
     WHERE my_column IS NOT NULL
    

    您永远不会想检查是my_column = null 还是my_column != null。不管my_column 的值是多少,这些谓词总是会评估为假。没有任何值等于NULL,也没有任何值不等于NULL,甚至没有另一个NULL 值。 Oracle 没有空字符串的概念。您要么拥有NULL,要么拥有一个包含一个或多个空格或其他填充字符的字符串。所以不需要检查值是否为空,只检查是否为NULL即可。

    【讨论】:

    • 谢谢贾斯汀。此查询的唯一问题是它不会将空白值评估为 null,因为它在网络上的许多地方都提到过。我什至尝试修改您提供的查询 SELECT * FROM my_table WHERE trim(my_column) IS NOT NULL;这仍然给我空字符串作为输出
    • @user2686860 - select dump(my_column) from my_table 显示您实际存储在该列中的是什么?似乎有问题的行中除了空格之外还有其他内容。
    • 有趣。它显示 Typ=1 Len=1: 30。不知道那是什么。
    • @user2686860 - 这告诉你有问题的行不是NULL 并且不是空白的。它包含一个字符,CHR(30)。那是“记录分隔符”字符(来自asciitable.com)。您可以查找具有此字符 select * from my_table where my_column = chr(30) 的行。或者你可以修剪那个字符而不是修剪空格select * from my_table where trim( chr(30) from my_column ) is null
    • 谢谢你已经回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    相关资源
    最近更新 更多