2012-03-29 34 views
5

Tôi đang sử dụng để viết truy vấn chọn và giá trị cho tuyên bố như vậy là động.Có thể thực hiện tìm kiếm phân biệt chữ hoa chữ thường trong câu lệnh LIKE trong SQL không?

AND  e.rank_request_id = a.request_id 
    AND  f.priority_request_id = a.request_id 
    AND  b.status_type_id = c.status_id 
    AND b.status_request_id = a.request_id 
    AND a.request_id LIKE '%#form.searchbar#%' 

Nhưng điều này trả về kết quả chỉ trường hợp của mỗi ký tự trong chuỗi # form.searchbar # được khớp.

Vui lòng đề xuất giải pháp thay thế cho điều này để nó trở nên không phân biệt chữ hoa chữ thường.

+3

cơ sở dữ liệu gì bạn đang sử dụng? – softarn

+1

DBMS nào? Buộc vỏ của cả hai mặt của thử nghiệm của bạn thường là những gì được thực hiện, bất kể hệ thống/ngôn ngữ. –

+1

Xem để tiêm SQL. –

Trả lời

17

Tôi không biết những gì bạn đang sử dụng cơ sở dữ liệu nhưng nếu điều này là dành cho Oracle sau đó bạn chỉ có thể buộc các trường hợp cả hai thứ. Điều này mặc dù đi kèm với chi phí cho thời gian thực hiện vì nó cho tất cả các giá trị trong cột đó nhưng bạn chỉ thấy chi phí nếu bạn có nhiều dữ liệu và có thể làm việc với chỉ số dựa trên hàm. Vì vậy, một cái gì đó như thế này, một lần nữa cho Oracle:

AND UPPER(a.request_id) LIKE '%#UCase(Form.Searchbar)#%' 

Nhưng tôi sẽ đề nghị bạn sử dụng một queryparam kể từ khi xuất hiện đến từ một người sử dụng đầu vào hộp, vì vậy:

AND UPPER(a.request_id) LIKE <cfqueryparam value="%#UCase(Form.Searchbar)#%" cfsqltype="cf_sql_varchar" /> 
+2

1 cho cfqueryparam. –

+0

Nếu bạn sử dụng trên trong một cột, cơ sở dữ liệu sẽ không sử dụng một chỉ mục nếu được định nghĩa trong cột đó, con trai trong một bảng lớn này sẽ chạy rất chậm. Bạn có thể định nghĩa một chỉ mục với hàm trên và để lại truy vấn như ví dụ và sau đó cơ sở dữ liệu sẽ sử dụng chỉ mục. Luôn xem lại kế hoạch thực hiện cho quyết định của cơ sở dữ liệu để sử dụng hoặc không phải chỉ mục của bạn. – Juan

1

Bạn có thể làm giảm a.request_id và form.searchbar

AND lower(a.request_id) LIKE '%#form.searchbar#%' 
+0

Không thành công nếu '% # form.searchbar #%' giống như Kiểm tra hoặc tEst –

+0

Có, chỉ cần tìm ra. Quên để nói để làm cho form.searchbar thấp hơn quá;) – Soader03

2

Đã có nhiều câu hỏi về trường hợp -Không nhạy cảm với các mệnh đề trong Oracle:

Ví dụ: here.

Ngoài ra, truy vấn này có vẻ như có thể dễ bị tấn công SQL injection. Thông tin thêm here.

+0

Câu hỏi này hơi khác một chút vì nó cũng liên quan đến ColdFusion. Đầu tiên là loại trên StackOverflow –

+0

Tôi hiểu, đủ công bằng. –

+0

+1 cho nguy cơ phun sql –

1

Bạn có thể buộc mọi thứ vào chữ hoa như Snipe656 gợi ý. Bạn cũng có thể sử dụng chức năng regexp_instr để thực hiện tìm kiếm phân biệt chữ hoa chữ thường. Ví dụ, để tìm kiếm bảng EMP cho mỗi hàng nơi ENAME chứa chuỗi 'trong' trong một case-insensitive thời trang

SQL> ed 
Wrote file afiedt.buf 

    1 select ename, empno 
    2 from emp 
    3* where regexp_instr(ename, 'in', 1, 1, 1, 'i') > 0 
SQL>/

ENAME   EMPNO 
---------- ---------- 
MARTIN   7654 
KING    7839 

Trong trường hợp của bạn, nó có lẽ sẽ là một cái gì đó giống như

AND regexp_instr(a.request_id, '#form.searchbar#', 1, 1, 1, 'i') > 0 
Các vấn đề liên quan