2012-10-24 85 views
2

我有一個表進程,其中包括一個ID (unsigned int, auto_increment)Name (varchar, unique)MySQL函數:選擇並返回列

選擇以下功能與任一輸入(無論是在表或不)總是導致

ERROR 1172(42000):結果由多行

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 
    RETURNS INT UNSIGNED 
BEGIN 
    DECLARE myid INT UNSIGNED; 
    SELECT ID INTO myid FROM Processes WHERE Name=nametwo; 
    RETURN myid; 
END$$ 

的但是,選擇下面的函數總是返回NULL:

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 
    RETURNS INT UNSIGNED 
BEGIN 
    DECLARE myid INT UNSIGNED; 
    SELECT ID INTO myid FROM Processes WHERE Name=nametwo; 
    RETURN myid; 
END$$ 

此外,請注意以下內容不會返回正確的結果(數字30和50是任意):

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 
    RETURNS INT UNSIGNED 
BEGIN 
    DECLARE myid INT UNSIGNED; 
    SELECT ID INTO myid FROM Processes WHERE Name=nametwo; 
    IF myid IS NULL THEN 
    RETURN 30; 
    ELSE 
    RETURN 50; 
    END IF; 
END$$ 

任何幫助表示讚賞。

更新:編輯刪除表列和函數參數之間的衝突。我不相信這是問題。

UPDATE2:請注意,當輸入參數爲或不在表格中時,以下情況均有效。爲什麼在沒有coalesce()的情況下,即使對於表中的輸入參數,函數是否返回NULL?

CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 
    RETURNS INT UNSIGNED 
BEGIN 
    DECLARE myid INT UNSIGNED; 
    SELECT ID INTO myid FROM Processes WHERE Name=nametwo; 
    RETURN COALESCE(myid, 0); 
END$$ 
+0

嘗試重命名輸入參數,因爲它是一樣的列名,並避免不同的充類型爲int。使用有符號或無符號。 –

+0

謝謝。重命名輸入參數。使聲明的var int無符號。不用找了。 – iraxef

+0

@iraxef你是否也在查詢中重命名參數? – Parado

回答

0

列名不區分大小寫MySql中,所以你可能會發現,where Name = name的意思是「給我的每一行」。

嘗試將輸入參數更改爲您的過程(以及查詢中的相應條件)爲srchName或與name不同的其他內容。

0

嘗試將輸入name重命名爲inputName等不同名稱。

更新: 另一個建議...
DECLARE myid INT UNSIGNED;
SET myid = (SELECT ID FROM Processes WHERE Name=nametwo);
RETURN myid;

+0

下面還沒有說明,噸工作: DROP FUNCTION IF EXISTS LookupOrInsertProcess $$ CREATE FUNCTION LookupOrInsertProcess(nametwo VARCHAR(255)) 返回int UNSIGNED BEGIN DECLARE本身份識別碼INT UNSIGNED; SELECT ID INTO myid FROM Processes WHERE Name = nametwo; RETURN myid; END $$ – iraxef

+0

以上檢查更新。 – Alex