2013-03-18 43 views
26

Trong SQLite nó có thể thay đổi các trường hợp hành vi nhạy cảm của 'LIKE' bằng cách sử dụng các lệnh:trường hợp nhạy cảm và không nhạy cảm như trong SQLite

PRAGMA case_sensitive_like=ON; 
PRAGMA case_sensitive_like=OFF; 

Tuy nhiên trong tình huống của tôi, tôi muốn thực hiện một truy vấn, một phần trong đó có phân biệt chữ hoa chữ thường và một phần không phải. Ví dụ:

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND caseInsensitiveField like 'g2%' 

Điều này có khả thi không?

+0

http://stackoverflow.com/a/973777/1427878 – CBroe

Trả lời

26

Bạn có thể sử dụng từ khóa UPPER trên trường không phân biệt chữ hoa chữ thường của bạn, sau đó viết hoa cho trường hợp của bạn. ví dụ.

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND UPPER(caseInsensitiveField) like 'G2%' 
+11

Lưu ý, điều này không hoạt động đối với các chữ cái không phải tiếng Anh. –

+0

@AlexanderMalakhov Làm việc cho các nhân vật Ý và Đức. Chỉ cần đảm bảo rằng db và dữ liệu bạn đã nhập trong đó là tất cả trong mã hóa UTF-8 và nó hoạt động. –

+6

@rbedger Lưu ý, bạn 'không cần hàm Upper', vì ** Giống như ** không phân biệt dạng chữ theo mặc định. –

3

Sử dụng so sánh đơn giản, đó là trường hợp nhạy cảm theo mặc định (trừ khi bạn đã tuyên bố cột COLLATE NOCASE):

SELECT * 
FROM mytable 
WHERE caseSensitiveField >= 'test' 
    AND caseSensitiveField < 'tesu' 
    AND caseInsensitiveField LIKE 'g2%' 

này chỉ hoạt động nếu bản gốc LIKE đang tìm kiếm một tiền tố, nhưng cho phép sử dụng một chỉ số.

1

Tôi biết đây là câu hỏi cũ, nhưng nếu bạn đang viết mã bằng Java và có vấn đề này, điều này có thể hữu ích. Bạn có thể đăng ký một chức năng xử lý việc kiểm tra tương tự. Tôi đã nhận các hình thức đầu bài đăng này: https://stackoverflow.com/a/29831950/1271573

Giải pháp i phụ thuộc vào jdbc sqlite: https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

Trong trường hợp của tôi, tôi chỉ cần để xem nếu một chuỗi nhất định tồn tại như một phần của chuỗi khác (như '% mystring% '), vì vậy tôi đã tạo ra một hàm Contains, nhưng nó có thể mở rộng điều này để làm một kiểm tra giống như sql hơn bằng cách sử dụng regex hoặc một cái gì đó.

Để sử dụng các chức năng trong SQL để xem nếu MyCol chứa "searchstring" bạn sẽ làm gì:

select * from mytable where Contains(MyCol, 'searchstring') 

Đây là Có tôi chức năng:

public class Contains extends Function { 

    @Override 
    protected void xFunc() throws SQLException { 
     if (args() != 2) { 
      throw new SQLException("Contains(t1,t2): Invalid argument count. Requires 2, but found " + args()); 
     } 
     String testValue = value_text(0).toLowerCase(); 
     String isLike = value_text(1).toLowerCase(); 

     if (testValue.contains(isLike)) { 
      result(1); 
     } else { 
      result(0); 
     } 
    } 
} 

Để sử dụng chức năng này trước tiên bạn phải đăng ký nó. Khi bạn đang thực hiện với việc sử dụng nó, bạn có thể tùy ý phá hủy nó. Dưới đây là cách thực hiện:

public static void registerContainsFunc(Connection con) throws SQLException { 
    Function.create(con, Contains.class.getSimpleName(), new Contains()); 
} 
public static void destroyContainsFunc(Connection con) throws SQLException { 
    Function.destroy(con, Contains.class.getSimpleName()); 
} 
+0

Tìm thấy lỗi trong mã của tôi. Nếu cột bạn đang sử dụng hàm Chứa có giá trị null được cho phép, bạn nên kiểm tra giá trị_text (n) cho null trước khi áp dụng hàm thLowerCase thứ. –

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