如何在Oracle中的String中查找精确的字符串匹配

时间:2010-11-05 01:12:30

标签: sql oracle plsql oracle10g

我有一个oracle表,其中有一个名为system_access的列,其中包含以下数据:

Read Only, Write, read only, Admin
Read, Write, read only, Admin
Admin, Read Only (no), read only(see mgr), Admin

根据上面的示例数据,我不确定我的查询只检索与“只读”和/或“只读”的确切字词匹配的记录

我不需要具有空格的“只读(否)”的记录,然后在它之前或之前括号或“只读(参见mgr)”,在它之后或之前没有空格和括号。

基于上面的样本数据,我只会回到两行,即:

Read Only, Write, read only, Admin
Read, Write, read only, Admin

如上所述,只有完全匹配字符串“只读”或“只读”的记录

6 个答案:

答案 0 :(得分:5)

有时在比较之前向字符串添加内容是有用的,然后每个元素都遵循相同的格式:

with testData as
(
  select 'Read Only, Write, read only, Admin' test from dual union all
  select 'Read, Write, read only, Admin'  test from dual union all
  select 'Admin, Read Only (no), read only(see mgr), Admin' test from dual
)
select * from testData
where lower(test)||',' like '%read only,%';

答案 1 :(得分:1)

带@Bob Jarvis(虽然我不能 让他使用下面的数据样本更进一步,然后放弃OR

WITH DATA AS(
SELECT '1- Read Only, Write, read only, Admin' SYSTEM_ACCESS FROM DUAL UNION
SELECT '2- Write, Admin,Read Only' SYSTEM_ACCESS FROM DUAL UNION
SELECT '3- Read, Write, read only, Admin' SYSTEM_ACCESS FROM DUAL UNION
select '4- ADMIN, READ ONLY (NO), READ ONLY(SEE MGR), ADMIN' system_access from dual 
)
select * 
  FROM DATA
 WHERE REGEXP_LIKE(SYSTEM_ACCESS, '(read only[ ,]+[^/(])|(read only$)','i');

REGEXP_LIKE(SYSTEM_ACCESS,'(只读[,] + [^ /(])|(只读$)','i'); 这将查找所有可能在其后面都有空格或逗号的“只读”实例,但禁止打开(或在字符串末尾的“只读”。

(http://www.regular-expressions.info/oracle.html& amp; http://psoug.org/snippet.htm/Regular_Expressions_Regex_Cheat_Sheet_856.htm?PHPSESSID=7238be874ab99d0731a9da64f2dbafd8

答案 2 :(得分:0)

从表中选择* lower(trim(column_name))='只读'

答案 3 :(得分:0)

尝试

SELECT *
  FROM TABLE
  WHERE REGEXP_LIKE(system_access, '[^()]. read only. [^()],', 'i') OR
        REGEXP_LIKE(system_access, '[^()]. read only. [^()]$', 'i');

我认为这对所显示的数据有用,但现在已经很晚了,我远不是正规表达大师,而且我没有方便的文档。

分享并享受。

答案 4 :(得分:0)

select * from table where lower(system_access) like '%read only,%';

只要表数据不变,这就可以工作。使用REGEX也可以正常工作,但是必须正确地再次制作正则表达式,如果数据发生变化则一切都是徒劳的。

答案 5 :(得分:0)

@jonearles answer中的搜索"%read only,%"方法可以正常使用。但是,由于您已经陷入困境,因此可能适合在权限测试中添加一些严谨性。

我很想假设你总是有逗号分隔的字符串,并且在进行权限测试时解析文本并检查特定条目“只读”和“只读”。

您还可以通过检查已解析的权限字符串中的每个标记来对照包含已知角色集的表(即“只读”,“只读(请参阅mgr)”)来扩展此功能。此表甚至可以包含一个标记,该标记与您在查询中可以使用的 “只读”定义相匹配。