Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Where子句中的空字符?_Sql_Oracle_Oracle11g - Fatal编程技术网

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个空格)吗?是的,我这样做了。这很有效。但是,在生产环境中,我将使用这些类型的值筛选的记录将具有空字符串。在这种情况下,我希望能够使用多个记录作为搜索条件。谢谢-这对我很有效,这是一个有用的引导说明。