如何区分局部变量和字段名?

How to differentiate between local variable and field name?

我在 MySQL(实际上是 MariaDB 10.3)中有一个存储过程,我声明了一个变量,我们称它为 name.

稍后在我的程序中,我想使用我的 name 变量来过滤 table。此 table 有一个字段 称为 name

如何使用我的 name 变量在 name 字段上过滤我的 table?

这是一个例子:

DELIMITER //

CREATE PROCEDURE doSomething()
BEGIN
    -- Declare a variable and load a value into it
    DECLARE name CHAR(6) DEFAULT NULL;
    SELECT value FROM tableA WHERE id = 6 INTO name;

    -- Use the variable in a query
    SELECT * FROM tableB WHERE name = name;
END; //

DELIMITER ;

CALL doSomething();

如您所见,我用 tableA 中的值加载了 name 变量。然后我想使用这个 name 变量过滤 tableB。显然,WHERE name = name 不起作用。

如何在字段名称旁边引用我的变量?类似于:

WHERE name = _variables_.name

从不 使用与列名相同的变量mysql 感到困惑

DELIMITER //

CREATE PROCEDURE doSomething()
BEGIN
    -- Declare a variable and load a value into it
    DECLARE _name CHAR(6) DEFAULT NULL;
    SELECT value FROM tableA WHERE id = 6 INTO _name;

    -- Use the variable in a query
    SELECT * FROM tableB WHERE name = _name;
END; //

DELIMITER ;

CALL doSomething();

文档清楚 locally declared variables take scope precedence over column names。因此,恕我直言,您的 SP 存在歧义。这是令人困惑和错误的。

但是,如果您在 SELECT 中使用 table 名称限定您的列名称,它就可以工作。像这样。

SELECT * FROM tableB WHERE tableB.name = name;