查询的输出必须返回公司不等于'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完全被排除了。
任何人都可以建议我。
答案 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( |$)')