如何区分局部变量和字段名?
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;
我在 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;