tra-loi-cau-hoi-phat-trien-web.com

Toán tử "IN" có thể sử dụng các ký tự THÍCH (%) trong Oracle không?

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 được đưa vào Oracle.

Tôi có thể sử dụng ký tự đại diện trong câu lệnh "IN" MySQL không?
Khá nhiều 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 tương đương pháp lý của

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

Cảm ơn vì bất kì sự giúp đỡ

22
Matt
Select * from myTable m
where m.status not like 'Done%' 
and m.status not like 'Finished except%'
and m.status not like 'In Progress%'
15
CFL_Jeff

Có vẻ như bạn cũng có thể sử dụng regrec

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

Tôi không chắc điều này sẽ hoạt động tốt như thế nào mặc dù ... xem tại đây

10
Sebastian Piu

Đ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 sử dụng các biểu thức thông thường vì dường như không có gì được tích hợp trong Oracle cho việc này.

Tôi lấy ra ví dụ từ chuỗi và chuyển đổi nó cho mục đích của bạn. Mặc dù vậy, tôi rất thích regex, vì vậy có thể cần phải điều chỉnh :)

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

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

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>
3
Tebbe

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 được ai đó. Về cơ bản, không có câu lệnh "in like" và không có cách nào để lấy chỉ mục cho các ký tự biến_bảng đầ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 "like" động nhanh để sử dụng trong SSRS.

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

1
Sethionic

Pháp lý gần nhất tương đương với cú pháp bất hợp pháp được đề 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ả câu trả lời của tôi và @ Sethionic đều có thể liệt kê các mẫu một cách linh hoạt (chỉ bằng cách chọn nguồn khác ngoài bảng sys.whatever quen thuộc). 

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

0
Tomáš Záluský