mysql - 将行引用作为 MySQL 函数输入参数传递

标签 mysql sql pass-by-reference

我正在创建一个函数,以便根据可用信息轻松地从用户帐户记录中检索客户名称。 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/

相关文章:

php - 如何在 MySQL/PHP 中处理用户数据,用于大量用户和数据条目

mysql - 使用索引使sql查询更快

新手的Mysql存储过程方程一步一步?

sql - 查看存储过程结果后的自定义结果

c++ - 如果传递函数,右值引用是否优化?

mysql - 根据另一列的 MAX 从一列中选择 DISTINCT

php - 如何在 joomla 2.5 中构建 sql 选择查询?

mysql - 我可以使用 EXISTS 而不是 JOIN 来加速这个查询吗?

c# - 跨线程使用引用对象

c++ - 按值传递比按引用传递更快