2011-09-06 11 views
47

Tôi không thể tìm ra ký tự gạch dưới nào trong câu lệnh SQLite like. Ký tự đại diện, %, có lẽ giống như trong hầu hết các cơ sở dữ liệu SQL khác.SQLite Giống như% và _

Vì vậy, nhân vật _ chết tiệt làm gì?

Trả lời

58

Dấu gạch dưới cũng giống như trong hầu hết các cơ sở dữ liệu SQL khác và khớp với bất kỳ ký tự đơn nào (tức là nó giống như . trong cụm từ thông dụng). Từ fine manual:

Dấu gạch dưới ("_") trong mẫu LIKE khớp với bất kỳ ký tự đơn nào trong chuỗi.

Ví dụ:

-- The '_' matches the single 'c' 
sqlite> select 'pancakes' like 'pan_akes'; 
1 
-- This would need '__' to match the 'ca', only one '_' fails. 
sqlite> select 'pancakes' like 'pan_kes'; 
0 
-- '___' also fails, one too many '_'. 
sqlite> select 'pancakes' like 'pan___kes'; 
0 

Và chỉ để đảm bảo kết quả có ý nghĩa: SQLite sử dụng zero and one for booleans.

+1

Cảm ơn bạn, mu. [thêm ký tự] – Francisc

+0

Lưu ý: 'chọn 'bánh kếp' như 'pan__kes'' hoạt động. –

76

Đó là SQL tiêu chuẩn mà trong LIKE biểu:

  • % phù hợp với bất kỳ chuỗi ký tự, bao gồm một trống. Nó tương đương với .* trong một biểu thức chính quy.
  • _ khớp với một ký tự đơn. Nó tương đương với . theo cụm từ thông dụng.
  • Bạn có thể chọn một nhân vật để thoát %, _ và bản thân mình với:

    ... WHERE expr LIKE 'a_b%c\\d\%\_' ESCAPE '\' 
    

    này sẽ phù hợp a×b×××c\d%_ hoặc a×bc\d%_ nhưng không abc\d%_ cũng không a×b×××cd%_.

Additionnally với SQLite bạn có từ khóa GLOB mà cư xử chính xác theo cùng một cách, ngoại trừ việc % trở thành *_ trở thành ?.

+0

Cảm ơn bạn, Benoit. Tôi đã chọn câu trả lời khác chỉ xét theo thời gian. – Francisc

+0

Điều này đã cứu mạng tôi. Tôi đã tìm cách để thoát khỏi '%' trong các truy vấn SQLite. Nhưng tôi đã phải cung cấp cho '\\' để làm cho nó hoạt động, không chỉ '\' (tôi đã làm việc trên Javscript + WebSQL). Dưới đây truy vấn làm việc cho tôi. SELECT * FROM cung cấp WHERE title LIKE '% 50 \\ %%' ESCAPE '\\' (điều này sẽ trả về tất cả các đề nghị có tiêu đề có 50%) – hashcoder

+0

@Francisc, tôi nghĩ bạn đã công bằng ngay từ đầu để chọn câu trả lời theo thời gian, nhưng câu trả lời này rõ ràng hơn câu trả lời hiện được chấp nhận. Nó sẽ là một dịch vụ cho người dùng trong tương lai để làm cho câu trả lời này được chấp nhận. – Suragch

0

Đối với bản ghi, tôi sử dụng trong môi trường XCode/Objective-C, '\' không hoạt động. Sử dụng bất cứ điều gì khác thay vì ...

C-phong cách thoát bằng cách sử dụng ký tự sổ ngược không được hỗ trợ bởi vì họ không phải là tiêu chuẩn SQL (https://www.sqlite.org/lang_expr.html)

6

Phụ Lục để @ Benoit của câu trả lời:

Các ESCAPE áp dụng cho biểu thức LIKE gần đây nhất, không phải tất cả các biểu thức LIKE. Để thoát khỏi tất cả các bạn phải sử dụng ESCAPE nhiều lần, chẳng hạn như bên dưới.

WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^' 

vị này phù hợp với giá trị của foo có chứa thanh%, hoặc baz cộng với bất kỳ nhân vật.