在部门表中查找单个“ o”

时间:2018-07-13 04:21:18

标签: sql oracle

 DEPTNO DNAME          LOC
------- -------------- ---------
     10 ACCOUNTING     NEW YORK
     20 RESEARCH       DALLAS
     30 SALES          CHICAGO
     40 OPERATIONS     BOSTON

我只希望芝加哥和纽约不要波士顿(仅单个o)在该位置。如果我这样做:

select * 
from dept 
where loc like '%o%';

它将显示多个“ O”,但我只想要一个。

5 个答案:

答案 0 :(得分:4)

使用REGEXP_COUNT

select * from department where  REGEXP_COUNT(loc,'o',1,'i') = 1; --'i' for case-insensitive

LENGTH(加上lower()/upper()使其不区分大小写)

select * from department where  length(loc) - length(replace(loc,'O')) = 1

Demo

答案 1 :(得分:2)

您可以使用LENGTH()来完成

SELECT * FROM department WHERE  (LENGTH(loc) - LENGTH(REPLACE(UPPER(loc),'O'))) = 1

答案 2 :(得分:1)

在这种情况下,我们可以简单地使用INSTR搜索所需字符/字符串的出现次数,然后在=0条件下添加WHERE来检索第二次出现的数据不存在

SELECT DEPTNO, DNAME, LOC
FROM yourtable
WHERE INSTR(LOC, 'O', 1, 2) = 0

输出:

DEPTNO  DNAME       LOC
10      ACCOUNTING  NEW YORK
20      RESEARCH    DALLAS
30      SALES       CHICAGO

如果您希望字符串中至少存在一个O,则将WHERE条件替换为下面的行

WHERE INSTR(LOC, 'O', 1, 2) = 0 AND INSTR(LOC, 'O', 1, 1) > 0

输出

DEPTNO  DNAME       LOC
10      ACCOUNTING  NEW YORK
30      SALES       CHICAGO

答案 3 :(得分:0)

只需使用两个比较:

select * 
from dept 
where loc like '%o%' and loc not like '%o%o%';

请注意,Oracle通常区分大小写,因此我建议:

select * 
from dept 
where lower(loc) like '%o%' and loc not like '%o%o%';

答案 4 :(得分:0)

 Select * from Dept where regexp_count(loc,'O')=1;

这将起作用