2010-09-14 28 views
9

Tôi có một truy vấn SQL được tham số hóa bởi một khuôn khổ nội bộ rất hạn chế. Truy vấn trông giống như sau:SQL Trong khoản có không đối với nhiều tham số

Select * from somewhere 
where name IN (:parameter); 

Mã sẽ đưa không đến nhiều chuỗi vào vị trí được chỉ định bởi tham số:. Cờ ": tham số" chỉ có thể được sử dụng trong mệnh đề "IN" (vì vậy nó không thể được di chuyển sau mệnh đề where để điều kiện chèn phần 'name IN').

Đôi khi người sử dụng sẽ thiết lập thông số để:

'chó', 'mèo'

Lần khác, người dùng sẽ không đặt bất kỳ giá trị vào: biến tham số. Điều này gây ra một vấn đề vì các truy vấn SQL kết quả sẽ là:

Select * from somewhere 
where name IN(); 

Mã của tôi có thể nắm bắt những trường hợp tham số là trống rỗng, nhưng tôi cần một cái gì đó mà tôi có thể tiêm vào báo cáo kết quả, trong đó đảm bảo sẽ không bao giờ phù hợp với một thực tế chuỗi.

Có bất kỳ biểu thức chính quy SQL nào mà tôi có thể tiêm mà KHÔNG BAO GIỜ khớp với bất kỳ chuỗi nào không? Một cái gì đó như%.% Hoặc một cái gì đó ....

Cảm ơn!

+0

Điều này có thể cần suy nghĩ thêm. Giả sử truy vấn là truy vấn thực tế của bạn, về cơ bản bạn chọn mọi bản ghi và mọi cột trong bảng cơ sở dữ liệu (có nghĩa là lớn, nếu nó yêu cầu một bảng IN), có thể không phải là chiến lược tốt nhất. –

+0

xem xét từ hướng khác, tại sao không cho phép người dùng gửi trang nếu trường đó trống? –

+0

@Robert - thực sự có các phần khác trong truy vấn; Tôi đơn giản hóa nó cho các mục đích của stackoverflow; tuy nhiên các phần khác không loại bỏ vấn đề với tham số tên – David

Trả lời

16

Bạn có thể nói:

where name in (null) 

này sẽ không bao giờ phù hợp, vì không có gì là tương đương với null

+1

Câu trả lời hay, nhưng tại sao 'null' không khớp với' null' ? – fastcodejava

+2

@fastcodejava: "so sánh với Null không bao giờ có thể dẫn đến Đúng hoặc Sai, nhưng luôn ở kết quả logic thứ ba, Không biết" http://en.wikipedia.org/wiki/Null_(SQL) Vì vậy, các kết quả «null = null' trong 'unknown' và mệnh đề' where' chỉ khớp với 'true'. – Andomar

+0

trích xuất (ngày từ ts.triggered_at) IN (null) Không hoạt động đối với tôi trong postgresql –

0

Tôi không nghĩ rằng bạn có thể đảm bảo rằng bạn sẽ không bao giờ khớp với chuỗi hiện có. Điều tốt nhất mà bạn có thể làm là xử lý trường hợp trong đó câu lệnh không hoạt động trên cơ sở dữ liệu; Tuy nhiên, mà không biết làm thế nào kịch bản đang được thực hiện tôi không thể tìm ra nhiều hơn nữa từ đó.

4

null không phải phù hợp với bất cứ điều gì (thậm chí không null chính nó.).

0

Tên không thể rỗng, vì vậy bạn có thể làm chuỗi rỗng?

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