SELECT pkid, title
FROM Portfolio whereString;
Таким образом, ваша переменная whereString
преобразуется в BOOLEAN
и всегда принимает значение true, поскольку она не пустая.
IF (keyid > 0 ) THEN
SET whereString = CONCAT( ' AND pkid = ', keyid );
END IF;
SET @SQLstmt = CONCAT('SELECT pkid, title FROM Portfolio ', whereString)
Это должно произойти сбой для значений выше 0
, так как это приводит к следующему утверждению:
SELECT pkid, title
FROM Portfolio
WHERE AND pkid = $keyid
-- ^
-- Wrong!
Просто используйте следующее утверждение:
SELECT pkid, title
FROM Portfolio
WHERE pkid = keyid
UNION ALL
SELECT pkid, title
FROM Portfolio
WHERE keyid = 0
Это оптимизирует один из SELECT
запросов и будет достаточно эффективным.