2011-04-22 105 views
0

是这样的有效MySQL中:MySQL的IF ... THEN接着是查询语句

DELIMITER // 
CREATE FUNCTION LOGIN_VALIDATE(IN uName VARCHAR(32),IN uPass VARCHAR(32)) 
RETURNS BOOLEAN 
BEGIN 
    DECLARE row_count BOOLEAN DEFAULT 0; 
    DECLARE stored_pass VARCHAR(32) DEFAULT NULL; 
    DECLARE valid_return BOOLEAN DEFAULT 0; 
    SELECT count(*) INTO row_count FROM Login WHERE userId='uName'; 
    IF row_count = 1 THEN 
     SELECT pWord INTO stored_pass FROM Login WHERE userId='uName'; 
    END IF; 
    IF stored_pass = 'uPass' THEN 
     SET valid_return = 1; 
    END IF; 
    RETURN valid_return; 
END // 
DELIMITER ; 
+0

我想'userId'应该是'Login'的主键?为什么你将第一个查询运行到row_count中? – Benoit 2011-04-22 06:50:46

+0

是userId是主键。我将它存储在row_count中以便稍后进行比较。 – check123 2011-04-22 06:59:01

回答

4

用途:

DECLARE valid_return BOOLEAN DEFAULT 0; 

SELECT CASE WHEN COUNT(*) = 1 THEN 1 ELSE 0 END 
    INTO valid_return 
    FROM LOGIN l 
WHERE l.userid = @uName 
    AND l.pword = @uPass 

一直尽量减少遍数在一个表来获得你想要的结果。 SQL是基于SET的,而不是过程性的 - 当它接近正确时,SQL对你更好。

+0

这似乎是做的工作,是的这一个是更有效率,但我只是困惑为什么不是我的逻辑工作,更因此,因为Mimer验证​​不给出主要的语法错误,而MySQL提示表明错误附近BEGIN。 – check123 2011-04-22 07:01:50

+0

@ check123:您不使用单引号引用MySQL中的变量--MySQL要求它们要么以“@”作为前缀,要么不在单引号(或双引号)内。 – 2011-04-22 07:06:12

+0

它最初并不起作用,但在删除@并且没有使用引号后它就起作用了。谢谢! – check123 2011-04-23 11:41:00