2012-03-02 36 views
22

Tôi đã tìm kiếm câu hỏi này và tìm thấy câu trả lời trong MySQL nhưng đây là một trong những sự cố mà tuyên bố không chuyển sang Oracle.Toán tử "IN" có thể sử dụng ký tự đại diện LIKE (%) trong Oracle không?

Can I use wildcards in "IN" MySQL statement?
khá nhiều tổng kết câu hỏi của tôi và những gì tôi muốn làm, nhưng trong Oracle

Tôi muốn tìm ra tương đương với quy phạm pháp luật của

Select * from myTable m 
where m.status not in ('Done%', 'Finished except%', 'In Progress%') 

Nhờ sự giúp đỡ

Trả lời

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

Tôi đã cố gắng tránh tuyến đường dài, nhưng có vẻ như đó là cách duy nhất – Matt

+0

@Matt Nếu đây chỉ là viết văn bản SQL ngắn hơn một chút, hơn là chỉ sử dụng cú pháp được đề xuất trong câu trả lời này và học trực tiếp với nó . Nếu đây là về LIKE hàng từ bảng khác (vì vậy bạn không thể thực sự xây dựng danh sách các giá trị trước), thì đây là một vấn đề khác hoàn toàn, mà sẽ yêu cầu một cái gì đó như: 'JOIN OTHER_TABLE ON NOT (YOUR_TABLE.FIELD LIKE OTHER_TABLE .FIELD) '... –

+0

Tôi đã kết thúc bằng cách sử dụng điều này vì lợi ích đơn giản, nhưng câu trả lời regex là hữu ích như một cơ hội để tìm hiểu một chút mới của Oracle. Cảm ơn tất cả – Matt

4

Điều này dường như phù hợp với những gì bạn đang tìm kiếm: https://forums.oracle.com/forums/thread.jspa?threadID=2140801

Về cơ bản, bạn sẽ cần phải sử dụng cụm từ thông dụng vì dường như không có gì được xây dựng thành oracle cho điều này.

Tôi đã lấy ví dụ ra khỏi luồng và chuyển đổi nó cho mục đích của bạn. Tôi hút tại của regex, mặc dù, vì vậy mà có thể không cần chỉnh :)

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

Dường như bạn có thể sử dụng regexp quá

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

Tôi không chắc chắn như thế nào điều này sẽ thực hiện mặc dù. .. thấy here

3

Không phải 100% những gì bạn đang tìm kiếm, nhưng loại một cách trong ra ngoài để làm việc đó:

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

Hơi phức tạp, nhưng:

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; 

Đây là một giải pháp cho một vấn đề rất độc đáo, nhưng nó có thể giúp ai đó. Về cơ bản không có tuyên bố "giống như" và không có cách nào để lấy chỉ mục cho các ký tự biến số đầu tiên của cột, vì vậy tôi đã thực hiện điều này để tạo ra một động nhanh "giống như" để sử dụng trong SSRS.

Nội dung danh sách ('Xong', 'Đã hoàn tất ngoại trừ', 'Đang tiến hành') có thể thay đổi.

+0

Đây là câu trả lời rất có giá trị vì nó có thể xử lý tốt cho nhiều mẫu. Trường hợp sử dụng của tôi là tìm kiếm chuỗi bên trong, vì vậy tôi đã cuộn tương tự nhưng một chút giải pháp đơn giản trong câu trả lời của riêng tôi. –

0

Tương đương pháp lý gần nhất với cú pháp bất hợp pháp đã đề cập trong câu hỏi là:

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 || '%' 
) 

Cả tôi và @ trả lời Sethionic làm cho có thể liệt kê mẫu tự động (chỉ bằng cách chọn nguồn nào khác hơn auxiliar sys.whatever bảng).

Lưu ý, nếu chúng ta đã phải mẫu tìm kiếm bên chuỗi (chứ không phải ngay từ đầu) và cơ sở dữ liệu chứa ví dụ status = 'Done In Progress', sau đó giải pháp của tôi (sửa đổi để like '%' || patterns.column_value || '%') sẽ vẫn tạo ra một hàng cho kỷ lục nhất định, whileas giải pháp của @ Sethionic (được sửa đổi thành một lần gia nhập khác trước a) sẽ tạo ra nhiều hàng cho mỗi lần xuất hiện mẫu. Không phán xét cái nào tốt hơn, chỉ cần nhận thức được sự khác biệt và lựa chọn cái nào phù hợp hơn với nhu cầu của bạn.

Các vấn đề liên quan