2012-09-07 36 views
6

Giả sử tôi muốn một JasperReport cho phép người dùng lọc vào một ngày nếu họ muốn. SQL như sau:.Điều kiện Các điều khoản trong JasperReports

select * from foo where bar = $P{bar} and some_date > $P{some.date} 

Bây giờ, tôi không muốn lọc theo một số ngày nếu họ không vượt qua ngày trong tôi thấy kludge sau mà mọi người sử dụng:

select * from foo where bar = $P{bar} $P!{some.date.fragment} 

Và tham số some.date.fragment được định nghĩa với mặc định sau:

($P{some.date} == null || $P{some.date}.equals("")) ? "" : "AND some_date >'" + new java.sql.Date($P{some.date}.getTime()).toString() + "'" 

này không hoạt động như toString không ra ngày trong một định dạng mà máy chủ SQL của tôi hiểu được. Tôi muốn có điều kiện vẫn còn sử dụng một tuyên bố chuẩn bị với trình điều khiển jdbc và quăng tham số trong, tôi chỉ muốn tuyên bố chuẩn bị được phụ thuộc vào nếu tham số là null hay không. Điều này có thể được thực hiện?

+0

Trong trường hợp của tôi tham số thứ hai là một chuỗi và một phần của mệnh đề where tôi đã sử dụng $ P {stringValue}. –

Trả lời

6

Trước khi bạn đã sử dụng biểu thức $P!{} Trình điều khiển JDBC thực hiện tất cả định dạng cho bạn.

Nhưng nếu bạn sử dụng biểu thức $P!{} bạn phải định dạng chính mình.

Something như thế này nên làm việc:

(
$P{some.date} == null 
? 
"" 
: 
"AND some_date >'" + (new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.SSS")).format($P{some.date}) + "'" 
) 

Tùy thuộc vào dữ liệu của bạn gõ bạn phải tùy chỉnh dd.MM.yyyy HH:mm:ss.SSS.

Nếu bạn không muốn sử dụng biểu thức $P!{}, bạn có thể tránh nó bằng giải pháp bên dưới.

Cá nhân tôi không thích cách này. Nó cũng có thể gây ra một kế hoạch thực hiện xấu.

Nếu không muốn sử dụng $P!{} vì bạn lo lắng về việc phun sql. Không cần thiết bao lâu thì tham số $P{some.date} của bạn chứa loại dữ liệu an toàn như java.lang.Date.


Tạo tham số. Hãy gọi nó là ${is_null_pram} và thêm một biểu hiện mặc định với lớp param Integer:

($P{some.date} == null ? 1 : 0) 

Bây giờ bạn có thể truy vấn:

SELECT 
    * 
FROM foo 
WHERE 
    bar = $P{bar} 
    AND 
     (
      some_date > $P{some.date} 
      OR 1 = $P{is_null_pram} 
     ) 
+0

Cũng không có giải pháp nào là những gì tôi muốn là một giải pháp lý tưởng. Tôi muốn tham số null để thay đổi sql đang được thực hiện, nhưng tôi cũng muốn trình điều khiển jdbc để tham số đầu vào.Tôi ghét tìm ra định dạng ngày tháng, vv Các tùy chọn thứ hai có vẻ tốt hơn, và tôi đã thực hiện một số thử nghiệm với kế hoạch hiển thị/kế hoạch giải thích và cơ sở dữ liệu xử lý OR một cách thích hợp bằng cách bỏ qua vị từ nếu có 1 = 1 điều kiện thực. –

+0

Chỉ cần một FYI cho bất kỳ ai thấy điều này. Có 'is_null_param' là một số nguyên mà bạn so sánh với số nguyên khác 1. So sánh chuỗi không được tối ưu hóa bởi một số cơ sở dữ liệu. –

+0

Jup. Chỉnh sửa xong. Cám ơn. – edze

1

Tôi nghĩ bạn có thể sử dụng chức năng:

$X{EQUAL, <column_name>, <parameter_name>}

Nó tối ưu hóa truy vấn như bạn có thể thấy trong trang trợ giúp this.

0

Bạn có thể sử dụng câu lệnh điều kiện này

select * 
    from foo 
    where bar = $P{bar} and some_date > $P{some.date} or $P{some.date} is null 
Các vấn đề liên quan