我正在创建一个函数,以便根据可用信息轻松地从用户帐户记录中检索客户名称。 id
以外的所有帐户字段都是可选的,并且可以为空,因此这将连续检查各种标识列,直到找到一个,返回 id
作为最后结果。
CREATE FUNCTION ACCOUNT_NAME(
fname varchar(50),
lname varchar(50),
company varchar(50),
email varchar(50),
id int(10) unsigned
)
RETURNS VARCHAR(100) DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER
RETURN
IF( TRIM(CONCAT(fname, ' ', lname)) <> '',
TRIM(CONCAT(fname, ' ', lname)),
IF( company <> '',
company,
IF(email <> '', email, id)
)
)
;
这很好用,但是我需要将每一列分别传递给函数,即:
SELECT ACCOUNT_NAME(
a.first_name,
a.last_name,
a.company,
a.email,
a.id
) AS client_name
FROM accounts AS a WHERE 1;
这不仅乏味,而且将来修改或扩展此功能将极其困难,可能需要查找和更新每个调用以及定义本身。
是否可以将对整行结果的引用作为输入参数传递?理想情况下,我想做这样的事情:
CREATE FUNCTION ACCOUNT_NAME(row result)
RETURNS VARCHAR(100) DETERMINISTIC CONTAINS SQL SQL SECURITY INVOKER
RETURN
IF( TRIM(CONCAT(row.first_name, ' ', row.last_name)) <> '',
TRIM(CONCAT(row.first_name, ' ', row.last_name)),
IF( row.company <> '',
row.company,
IF(row.email <> '', row.email, row.id)
)
)
;
SELECT ACCOUNT_NAME(a.*) AS client_name
FROM accounts AS a WHERE 1;
最佳答案
您的字面问题的答案是否定的——存储过程或存储函数的参数不能是对行对象的引用。它们必须是标量数据类型,例如您用于在表中定义列的数据类型。
您可以改为定义一个 VIEW:
CREATE OR REPLACE VIEW accounts_view (id, client_name) AS
SELECT id, COALESCE(
NULLIF(CONCAT(fname, ' ', lname), ' '),
NULLIF(company, ''),
NULLIF(email, ''),
id) AS client_name
FROM accounts;
那么就可以更简单的查询了:
SELECT client_name
FROM accounts_view;
如果您曾经更改过client_name
的格式化方式,那么只需使用另一个CREATE OR REPLACE VIEW。陈述。重写 View 定义非常快。
关于mysql - 将行引用作为 MySQL 函数输入参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20790855/