带<>的sql和子串函数

时间:2011-05-14 03:06:22

标签: sql oracle oracle11g

查询的输出必须返回公司不等于'CABS'或公司子串的记录,直到空白空间(例如CABS NUTS)。公司名称可以是CABS,COBS,CABST,CABS NUTS,CAB

SELECT * 
  FROM records 
 WHERE UPPER(SUBSTR(company, 0, (INSTR(company,' ')-1))) <> 'CABS' 
    OR COMPANY <> 'CABS'

但是上面的查询是将CABS NUTS与COBS,CAB一起撤回。

我尝试使用“LIKE CABS”它看起来很好但是如果公司名称是“CAB”它将不会返回“CABS”和CABS NUTS因为喜欢。所以LIKE完全被排除了。

任何人都可以建议我。

6 个答案:

答案 0 :(得分:1)

因此,您希望公司字段的前4个字符不是“CABS”的所有记录。好的。

WHERE left(company, 4) != 'CABS'

答案 1 :(得分:1)

SELECT
  *
FROM
  Records
WHERE
  LEFT(Company, 4) <> 'CABS'
  AND Company <> 'CABS'

注意:基本TSQL字符串比较不区分大小写

答案 2 :(得分:1)

可以确定你想要返回哪些,但是你考虑过LIKE 'CABS %'

答案 3 :(得分:0)

select * from records where company NOT IN (SELECT company 
FROM records 
WHERE UPPER(SUBSTR(company, 0, (INSTR(company,' ')-1))) = 'CABS' 
OR COMPANY = 'CABS')

我认为这将从记录表中获取所需的记录

RECORDS:

COMPANY
=====================
CAB
CABST
COBS

答案 4 :(得分:0)

首先,我认为您应该在复合条件下使用AND而不是OR

其次,你可以这样简化条件:

WHERE UPPER(SUBSTR(company, 0, (INSTR(company || ' ',' ') - 1))) <> 'CABS' 

也就是说,在这种情况下不需要company <> 'CABS'部分。

答案 5 :(得分:0)

您遇到的问题是因为如果没有空格,SUBSTR的结果为null。由于有三个值逻辑,some_var <> NULL的结果为NULL,而不是您所期望的TRUE。

下面的查询显示了这方面的例子:

with mytab as (
  select 1 as myval from dual union all
  select 2 as myval from dual union all
  select null as myval from dual
)
select *
from mytab
where myval = 1
union all
select *
from mytab
where myval <> 1

此示例仅返回两行,而不是您可能期望的三行。

有几种方法可以重写条件,使其忽略substr函数的null结果。这些列在下面。但是,正如其他一位受访者所提到的,这两个条件需要使用AND运算符而不是OR来连接。

首先,您可以使用下面的一组条件明确检查列中是否有空格:

(INSTR(company,' ') = 0 or 
 UPPER(SUBSTR(company, 0, (INSTR(company,' ')-1))) <> 'CABS') and 
COMPANY <> 'CABS'

另一种选择是使用LNNVL功能。这是我最近才发现的功能。当作为输入提供的条件的结果为FALSE或NULL时,它从一个条件返回TRUE。

lnnvl(UPPER(SUBSTR(company, 0, (INSTR(company,' ')-1))) = 'CABS') and 
      COMPANY <> 'CABS'

另一个选项(可能是我的首选选项)是使用REGEXP_LIKE函数。这很简单,易于阅读。

WHERE not regexp_like(company, '^CABS( |$)')