2012-03-02 124 views

回答

15
Select * from myTable m 
where m.status not like 'Done%' 
and m.status not like 'Finished except%' 
and m.status not like 'In Progress%' 
+0

我试图避免漫长的路线,但它看起来像它可能是唯一的方法 – Matt 2012-03-02 20:53:15

+0

@Matt如果这只是写了稍短的SQL文本,而不仅仅是使用本答案中提出的语法并学习它。如果这是关于LIKE来自另一个表的行(所以你不能事先构造值的列表),那么这完全是一个不同的问题,这需要类似这样的东西:'JOIN OTHER_TABLE ON NOT(YOUR_TABLE.FIELD就像OTHER_TABLE .FIELD)'...... – 2012-03-02 21:13:13

+0

为了简单起见,我最终使用了这种方法,但正则表达式的答案对于学习新的Oracle有帮助。谢谢所有 – Matt 2012-03-06 16:54:25

4

这看起来符合您的要求:https://forums.oracle.com/forums/thread.jspa?threadID=2140801

基本上,您将需要使用正则表达式,因为这似乎没有内置到oracle中。

我从线程中提取了示例并将其转换为您的用途。我吸在正则表达式的,虽然如此,可能需要调整了:)

SELECT * 
FROM myTable m 
WHERE NOT regexp_like(m.status,'((Done^|Finished except^|In Progress^)') 
10

看来你可以使用正则表达式太

WHERE NOT REGEXP_LIKE(field, '^Done|^Finished')

我不知道有多好,这将执行,虽然。 ..看到here

3

不是100%是你所寻找的,但那种做它的由内而外的方式:

SQL> CREATE TABLE mytable (id NUMBER, status VARCHAR2(50)); 

Table created. 

SQL> INSERT INTO mytable VALUES (1,'Finished except pouring water on witch'); 

1 row created. 

SQL> INSERT INTO mytable VALUES (2,'Finished except clicking ruby-slipper heels'); 

1 row created. 

SQL> INSERT INTO mytable VALUES (3,'You shall (not?) pass'); 

1 row created. 

SQL> INSERT INTO mytable VALUES (4,'Done'); 

1 row created. 

SQL> INSERT INTO mytable VALUES (5,'Done with it.'); 

1 row created. 

SQL> INSERT INTO mytable VALUES (6,'In Progress'); 

1 row created. 

SQL> INSERT INTO mytable VALUES (7,'In progress, OK?'); 

1 row created. 

SQL> INSERT INTO mytable VALUES (8,'In Progress Check Back In Three Days'' Time'); 

1 row created. 

SQL> SELECT * 
    2 FROM mytable m 
    3 WHERE +1 NOT IN (INSTR(m.status,'Done') 
    4   ,  INSTR(m.status,'Finished except') 
    5   ,  INSTR(m.status,'In Progress')); 

     ID STATUS 
---------- -------------------------------------------------- 
     3 You shall (not?) pass 
     7 In progress, OK? 

SQL> 
1

有点绕口,但:

Select * from myTable m 
join (SELECT a.COLUMN_VALUE || b.COLUMN_VALUE status 
FROM (TABLE(Sys.Dbms_Debug_Vc2coll('Done', 'Finished except', 'In Progress'))) a 
JOIN (Select '%' COLUMN_VALUE from dual) b on 1=1) params 
on params.status like m.status; 

这是一个非常独特的问题的解决方案,但它可能会帮助别人。基本上没有“in like”语句,并且没有办法获得列的第一个variable_n个字符的索引,所以我做了一个快速动态的“in like”以用于SSRS。

列表内容('完成','完成除外','正在进行')可以是可变的。

+0

这是非常有价值的答案,因为它适合多种模式。我的用例是在字符串内搜索,所以我在自己的答案中推出了类似的简化解决方案。 – 2017-06-23 16:17:54

0

最接近的合法等同于问题中提及非法语法是:

select * from myTable m 
where not exists (
    select 1 
    from table(sys.ku$_vcnt('Done', 'Finished except', 'In Progress')) patterns 
    where m.status like patterns.column_value || '%' 
) 

两个矿山和@ Sethionic的回答使能够动态列表模式(只通过选择其他来源不是附配sys.whatever表)。

注意,如果我们不得不寻找内字符串(而不是从一开始)和数据库包含例如status = 'Done In Progress'模式,然后 我的解决方案(修改为like '%' || patterns.column_value || '%')将仍然产生一行定记录,whileas @ Sethionic的解决方案(修改为a之前的另一个辅助连接)将为每个模式发生产生多行。 不要判断哪个更好,只要注意差异并选择更适合您的需求。

相关问题