Sql Where子句中的空字符?
我有下表:Sql Where子句中的空字符?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有下表: CREATE TABLE SOAUDIT (SOU_USER CHAR(8 BYTE), SOU_ORDREF CHAR(8 BYTE), SOU_TYPE CHAR(1 BYTE), SOU_DESC CHAR(50 BYTE)) 在前三列上定义了一个唯一的索引(但没有主键,这是我们无法控制的) 表中有一些记录: | SOU_USER | SOU_ORDREF | SOU_TYPE | SOU_DESC | |----------|-
CREATE TABLE SOAUDIT
(SOU_USER CHAR(8 BYTE),
SOU_ORDREF CHAR(8 BYTE),
SOU_TYPE CHAR(1 BYTE),
SOU_DESC CHAR(50 BYTE))
在前三列上定义了一个唯一的索引(但没有主键,这是我们无法控制的)
表中有一些记录:
| SOU_USER | SOU_ORDREF | SOU_TYPE | SOU_DESC |
|----------|------------|----------|------------------|
| proust | | S | recherche |
| joyce | 12345678 | S | pelurious |
| orwell | 19841984 | T | doubleplusungood |
| camus | 34598798 | P | peiner |
仔细检查,用户“普鲁斯特”的SOU_ORDREF中的值似乎是一个8个字符的空字符字符串
现在,我需要做的是根据表的唯一值(我将从SQL Server数据库接收到)查询该表(只是为了使问题复杂化)。在SOU_ORDREF的情况下,搜索值将是一个空白字段:
SELECT *
FROM SOAUDIT
WHERE (SOU_USER, TRIM(SOU_ORDREF), SOU_TYPE)
IN (('proust', null, 'S'))
这不会返回我正在查找的记录
当我重写查询时,如下所示:
SELECT *
FROM SOAUDIT
WHERE (SOU_USER, SOU_TYPE)
IN (('proust', 'S'))
AND TRIM(sou_ordref) is null
然后我确实得到了想要的记录
但是,我希望能够将多条记录传递到WHERE
子句中,这样第二个版本就没有真正的帮助了。请尝试以下方法:
SELECT *
FROM test
WHERE SOU_USER = 'proust'
AND SOU_TYPE = 'S'
AND TRIM(sou_ordref) = ''
由于空字符不同于NULL
Oracle--默认情况下--将空字符串和NULL
视为同一事物
这可能会导致尴尬的行为,因为与NULL
的比较几乎永远不会返回true。因此像where sou_ordref=''
这样的简单表达式永远不会返回true,因为它相当于where sou_ordref=NULL
以下是一个解决方法:
SELECT *
FROM SOAUDIT
WHERE (SOU_USER, COALESCE(TRIM(SOU_ORDREF), ' '), SOU_TYPE) IN
( ('proust', ' ', 'S') )
请注意,这将用空格替换空字符串(
NULL
),然后将结果与空格进行比较。8个字符的空字符字符串不是空字符串…您尝试过'
(8个空格)吗?是的,我这样做了。这很有效。但是,在生产环境中,我将使用这些类型的值筛选的记录将具有空字符串。在这种情况下,我希望能够使用多个记录作为搜索条件。谢谢-这对我很有效,这是一个有用的引导说明。