2011-12-06 34 views
5

Tôi đang gặp khó khăn với truy vấn trong MySQL.Đầu ra sai MySQL với mệnh đề IN và tham số

Tôi đang làm việc với Delphi XE và tôi đang gửi truy vấn với một số tham số đến MySQL. Dưới đây là một ví dụ cho truy vấn:

SELECT * FROM users u WHERE u.id IN (:idUsers); 

Các ': idUsers' là biến mà sẽ nhận được thông số tôi gửi với Delphi, mà là một chuỗi chứa được định dạng như thế này, cựu .: 1,2, 3

Vấn đề là với chuỗi này, tôi chỉ nhận được người dùng đầu tiên (id = 1). Từ những gì tôi có thể thấy, nó giống như MySQL đang thêm một số trích dẫn ('') ở đầu và ở cuối chuỗi mà tôi gửi, như thể nó là '1,2,3' thay vì 1,2,3. Tôi đã thử chọn này:

SELECT * FROM users u WHERE u.id IN ('1,2,3'); 

và nó thực sự trở lại chỉ có người dùng đầu tiên ..

Tôi đã có một chức năng trong MSSQL được tách chuỗi Tôi sended và trả về một bảng tạm thời, nhưng chúng tôi gần đây đã chuyển sang MySQL và từ những gì tôi đọc, MySQL không cho phép trả lại bảng.

Bất kỳ ai cũng có manh mối về cách giải quyết vấn đề này? Tôi đã loại bỏ các trang web cho một câu trả lời và đã không tìm thấy một cho vấn đề cụ thể này.

Cảm ơn sự giúp đỡ.

+0

Bạn có thể dán mã của mình ở đây không? Tôi đã sử dụng truy vấn tương tự và không phát hiện lỗi này bất kỳ lúc nào. – Shirish11

Trả lời

10

Thông số không hoạt động như vậy; họ không có ý tưởng rằng những gì bạn đang cố gắng cung cấp là danh sách giá trị được phân cách bằng dấu phẩy. Nếu bạn đặt ParamByName('WhatEver').AsString hoặc Value, nó cho rằng bạn có nghĩa là chuỗi được trích dẫn chứa mọi thứ thuộc về thông số đó. Vì vậy, nó làm chính xác những gì nó xuất hiện - nó đi qua IN ('1, 2, 3'), thay vì dự định IN (1, 2, 3).

Bạn sẽ cần phải quay trở lại để phân tích cú pháp và tự sử dụng bảng tạm thời hoặc xây dựng mệnh đề WHERE động và nối nó trước khi thực hiện truy vấn. (Trên thực tế, bạn có thể tạo truy vấn động, tạo thông số mới cho từng mục trong mệnh đề IN và sau đó lặp lại và gán giá trị cho từng tham số được tạo động, nhưng điều đó rất xấu xí rất nhanh.)

+0

Cảm ơn rất nhiều vì câu trả lời của bạn. Ghép nối truy vấn bên trong Delphi và sau đó thực hiện truy vấn hoạt động. Việc xây dựng truy vấn động sẽ không hoạt động vì tôi đang tìm nạp truy vấn từ một bảng chứa tất cả các truy vấn cần thiết trong ứng dụng. Những gì tôi đã làm là thay thế các tham số ": idUsers" bởi "$ idUsers" và bên trong Delphi Tôi đang làm một AnsiStrReplace của "$ idUsers" với một chuỗi mà tôi đã tạo trước đó. – Simon

+0

:) Tôi rất vui vì bạn đã làm việc đó.Âm thanh như một giải pháp tốt (miễn là bạn không phải lo lắng về việc tiêm SQL). –

0

Nếu bạn có một số tham số trong mệnh đề IN, bạn có thể xây dựng một bảng tạm thời trong MYSQL (chỉ chứa một cột có tên là ID), nạp các giá trị tham số vào bảng tạm thời và sau đó thực hiện như sau:

SELECT * FROM users u WHERE u.id IN (SELECT ID FROM TEMPTABLE); 

Lâu dài TEMPTABLE chỉ chứa các giá trị bạn muốn truy vấn, quét vùng bảng có thể chấp nhận được.

Sau đó, bạn có thể có số lượng giá trị thay đổi. Bạn cũng có thể đặt bảng vĩnh viễn và lưu trữ các tham số. Thêm cột cho Người dùng và mỗi người dùng có thể lưu trữ các thông số riêng lẻ của họ.

+0

Điều này đã được đề cập, cả trong câu hỏi gốc và trong câu trả lời của tôi. :) –

+0

Rất tiếc, đã bỏ lỡ đề cập đến – David

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