2012-09-17 33 views
5

Tôi hy vọng một người nào đó sẽ có thể trợ giúp. Tôi đã tạo ra procdure được lưu trữ đầu tiên của tôi (không có gì ưa thích) tuy nhiên im chạy vào một vấn đề.MYSQL - Quy trình được lưu trữ Sử dụng chuỗi phân tách bằng dấu phẩy như đầu vào biến

Tôi muốn để cho nó một đầu vào chuỗi như 1,2,3,4,5 sau đó nó hoạt động đơn giản SELECT * FROM [TABLE] WHERE EAN IN (VAR);

Vì vậy, các proc lưu trữ trông như thế này:

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE PROCEDURE `moments`.`new_procedure`(IN var1 VARCHAR(255)) 
BEGIN 

SELECT * FROM moments.PRODUCT WHERE EAN IN (var1); 

END 

Im am cố gắng để thực hiện nó như ví dụ:

trình

call moments.new_procedure('5045318357397') 

không hoạt động được

call moments.new_procedure('5045318357397,5045318357427'); 

này thực thi nhưng doesnt không mang lại bất kỳ kết quả. Là nó classing tuyên bố thứ hai như là một chuỗi để nó làm điều này:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397,5045318357427') 

và không này:

select * from moments.PRODUCT WHERE EAN IN ('5045318357397','5045318357427') 

Làm thế nào để tôi có để định dạng đầu vào trong truy vấn thực hiện để làm cho nó mất một chuỗi phân tách bằng dấu phẩy làm đầu vào?

Trả lời

12

Bạn có thể sử dụng:

SELECT * FROM moments.PRODUCT 
WHERE FIND_IN_SET(EAN, var1) 

này nên làm việc giả định nó là thực sự được phân tách bằng dấu phẩy. Bất kỳ phân định nào khác sẽ không hoạt động trong trường hợp này.

+0

Điều này hoạt động hoàn hảo bên trong proc được lưu trữ, cảm ơn bạn. Đây cũng là cách tôi sẽ gọi nó từ ứng dụng Cast Iron, đây là phần thưởng bổ sung. – MMKD

+2

hoạt động, nhưng không hiệu quả vì nó cần tìm nạp tất cả các hàng từ bảng, sau đó so sánh từng hàng với tập hợp của bạn, do đó cũng phải lặp qua danh sách được phân cách bằng dấu phẩy để kiểm tra xem nó có khớp không ... Số cột thấp, nếu không thì bạn nên tìm cách đánh dấu – Populus

+0

@Populus bình luận cần được nhổ bật nhiều hơn - FIND_IN_SET không sử dụng bất kỳ chỉ mục bảng nào, vì vậy có khả năng là một vấn đề hiệu suất lớn nếu được sử dụng theo cách này –

1

Giả sử chuỗi bạn qua được xác nhận bằng cách nào đó và không chứa sql độc hại, bạn có thể sử dụng chuẩn bị phát biểu:

PREPARE stmt1 FROM CONCAT('select * from moments.PRODUCT WHERE EAN IN (',var1,')'); 
EXECUTE stmt1; 
Các vấn đề liên quan