2011-12-06 32 views
5

我很難在MySQL中查詢。MySQL錯誤的輸出與IN子句和參數

我正在使用Delphi XE,我正在向MySQL發送一個帶有參數的查詢。下面是用於查詢的示例:

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

在「:idUsers」是將接收I用Delphi,它是含有一個字符串被格式化這樣的,例:1,2-發送參數可變, 3

問題是,用這個字符串,我只收到第一個用戶(id = 1)。從我所看到的,它就像MySQL在我發送的字符串的開頭和結尾添加了一些引號(''),就像它是'1,2,3'而不是1,2,3。我試過這個選擇:

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

,它確實只返回第一個用戶..

我在MSSQL一個函數,劈開我sended串並返回一個臨時表,但我們最近轉換到MySQL,並從我讀的,MySQL不允許返回表。

任何人都有如何解決這個問題的線索?我一直在網上尋找答案,並沒有找到這個具體問題。

感謝您的幫助。

+0

你可以在這裏粘貼你的代碼嗎?我一直在使用類似的查詢,並且在任何時候都沒有發現這個錯誤。 – Shirish11

回答

10

參數不起作用,他們不知道你試圖提供的是一個逗號分隔的值列表。如果您設置了ParamByName('WhatEver').AsStringValue,它認爲您的意思是一個帶引號的字符串,其中包含屬於該參數的所有內容。所以它看起來就是這樣 - 它通過IN ('1, 2, 3'),而不是打算的IN (1, 2, 3)

您需要返回自己解析並使用臨時表,或者在執行查詢之前動態構建WHERE子句並將其連接起來。 (實際上,你可以動態地通過構建查詢時,IN子句中創建每個項目的一個新的參數,然後循環和賦值給每個那些動態創建的參數,而是變得非常難看得很快。)

+0

非常感謝您的回答。在Delphi中連接查詢,然後執行查詢。動態構建查詢不會起作用,因爲我從包含應用程序中所需的所有查詢的表中獲取查詢。我所做的是替換參數:用「$ idUsers」和德爾福裏面我做的「$ idUsers」用繩子我事先建立了一個AnsiStrReplace「idUsers」。 – Simon

+0

:)我很高興你得到它的工作。聽起來像一個很好的解決方案(只要你不必擔心SQL注入)。 –

0

如果你有一個可變數目的IN子句中的參數,你可以建立在MYSQL臨時表(只包含一個名爲ID列),參數值加載到臨時表,然後做這樣的事情:

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

只要TEMPTABLE只包含要查詢的值,表空間掃描就可以接受。

然後,您可以擁有可變數量的值。您也可以將表格永久化並存儲參數。爲用戶添加一列,並且每個用戶可以存儲他們各自的參數。

+0

這已經在原始問題和我的答案中提到過了。 :) –

+0

對不起錯過了提 – David