【发布时间】:2013-04-17 15:18:38
【问题描述】:
我的数据库中有以下结构:
id,col_a,col_b,col_c,etc...
现在,除了 id 之外的所有其他列都是布尔类型。比如说
col_a=1,
col_b=0,
col_c=1
我正在寻找一种方法来返回列为真 (=1) 的列的名称,因此在此示例中,返回应该类似于 col_a,col_c
会有动态数量的列,因为表经常被更改以添加新列并删除旧列。
到目前为止我的函数看起来像这样 - 它是应该返回列名字符串的函数......
DROP FUNCTION fn_access;
DELIMITER //;
CREATE FUNCTION fn_access (myid INT) RETURNS varchar(800)
DETERMINISTIC
BEGIN
DECLARE ret_val VARCHAR(800);
DECLARE col_name VARCHAR(255);
DECLARE i INT;
DECLARE num_rows INT;
DECLARE col_names CURSOR FOR
SELECT column_name
FROM information_schema.columns
WHERE `table_name` = 'access' AND `table_schema` = 'some_db' AND `column_name` <> 'id'
ORDER BY ordinal_position;
SELECT FOUND_ROWS() into num_rows;
SET i = 1;
the_loop: LOOP
IF i > num_rows THEN
CLOSE col_names;
LEAVE the_loop;
END IF;
FETCH col_names
INTO col_name;
SET ret_val = CONCAT(',' col_name);
SET i = i + 1;
END LOOP the_loop;
SELECT * FROM access WHERE id = @myid;
RETURN ret_val;
END
//
有没有办法使用直接 SQL 来做到这一点?我正在使用 MySQL。
【问题讨论】:
-
列为真的列???您的意思是列本身或相应的行值
-
是的,行值。所以换句话说,我想要
col_a如果col_a = 1,col_b如果col_b = 1等等。