2013-08-01 46 views
5

Phần cuối là máy chủ PostgreSQL 9.1.Nhận tên tham số từ truy vấn SQL

Tôi đang cố gắng tạo báo cáo XML AdHoc. Các tệp báo cáo sẽ chứa các truy vấn SQL, tất cả đều phải bắt đầu bằng câu lệnh SELECT. Các truy vấn SQL sẽ có các tham số. Tùy thuộc vào kiểu dữ liệu của các cột được liên kết, các tham số này sẽ được trình bày tương ứng cho người dùng để cung cấp (các) giá trị.

Một truy vấn SQL rought:

SELECT * FROM customers 
WHERE 
(
    [email protected]_code AND [email protected] 
    AND customers.type= 
    (
     SELECT type from types 
     WHERE [email protected]_code 
     AND types.is_active = @type_is_active 
    ) 
    AND customers.account_open_date BETWEEN @start_date AND @end_date 
) 
OR customers.flagged = @flagged; 

Tôi muốn để có được danh sách các tên cột và các thông số từ chuỗi truy vấn và đặt chúng vào một mảng chuỗi và xử lý sau.

tôi có thể phù hợp với chỉ các thông số bằng cách sử dụng biểu thức chính quy sau:

@(?)(?<parameter>\w+) 

Matches dự kiến:

[email protected]_code 
[email protected] 
[email protected]_code 
types.is_active = @type_is_active 
customers.account_open_date BETWEEN @start_date AND @end_date 
customers.flagged = @flagged 

Làm thế nào để phù hợp với "@Parameter", "=", và "GIỮA" ngay lập tức?

+0

Nếu bạn đang sử dụng XML thì tại sao không có một yếu tố thông số và phụ tùng cho mình những rắc rối? – Romoku

+0

Vì vậy, bạn muốn tìm "@ {variablename}" trong truy vấn sql của mình và thay thế bằng giá trị thực tế mà người dùng muốn? – ganders

+0

Xin cảm ơn. :) Bạn có nghĩ rằng việc trộn lẫn SQL và XML có thể trở nên khá phức tạp không? –

Trả lời

2

Tôi biết đó là một chút trễ, nhưng vì lợi ích của nghiên cứu tương lai:

Tôi nghĩ Regex này phục vụ mục đích của bạn:

(\w+\.\w+(?:\s?\=\s?\@\w+|\sBETWEEN\s\@\w+\sAND\s\@\w+)) 

Kiểm tra this Regex101 fiddle ở đây, và đọc kỹ các lời giải thích cho mỗi phần của nó.

Về cơ bản, trước tiên, nó sẽ tìm kiếm các cột customer.xxx_yyy của bạn và sau đó là = @variable hoặc BETWEEN @variable1 AND @variable2.

nhóm chụp:

MATCH 1 
1. [37-75] 
`[email protected]_code` 

MATCH 2 
1. [80-108]  
`[email protected]` 

MATCH 3 
1. [184-205] 
`[email protected]_code` 

MATCH 4 
1. [218-251] 
`types.is_active = @type_is_active` 

MATCH 5 
1. [266-327] 
`customers.account_open_date BETWEEN @start_date AND @end_date` 

MATCH 6 
1. [333-361] 
`customers.flagged = @flagged` 
Các vấn đề liên quan