当前位置: 首页 > 面试题库 >

选择符合条件的列名(MySQL)

薛元忠
2023-03-14
问题内容

我的数据库中具有以下结构:

id,col_a,col_b,col_c,etc...

现在,除id以外的所有其他列均为boolean类型。例如说

col_a=1,
col_b=0,
col_c=1

我正在寻找一种返回列名称为true(= 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。


问题答案:

如果我正确理解了您的问题,也许您需要这样的东西:

SELECT 'col_a' col
FROM yourtable
WHERE col_a
UNION
SELECT 'col_b'
FROM yourtable
WHERE col_b
UNION
SELECT 'col_c'
FROM yourtable
WHERE col_c
...

这将返回表中至少有一行为真的所有列。

也许这样:

SELECT
  id,
  CONCAT_WS(', ',
    CASE WHEN col_a THEN 'col_a' END,
    CASE WHEN col_b THEN 'col_b' END,
    CASE WHEN col_c THEN 'col_c' END) cols
FROM
  yourtable

将以以下格式返回行:

| ID | COLS                |
----------------------------
|  1 | col_a, col_c        |
|  2 | col_a, col_b, col_c |
|  3 |                     |
|  4 | col_c               |
...

请看这里的小提琴。而且,如果您需要动态地执行此操作,则可以使用以下准备好的语句:

SELECT
  CONCAT(
    'SELECT id, CONCAT_WS(\', \',',
  GROUP_CONCAT(
    CONCAT('CASE WHEN ',
           `COLUMN_NAME`,
           ' THEN \'',
           `COLUMN_NAME`,
           '\' END')),
    ') cols FROM yourtable'
  )
FROM
  `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE
  `TABLE_NAME`='yourtable'
  AND COLUMN_NAME!='id'
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

在这里摆弄。



 类似资料:
  • 问题内容: 我有两个这样的表,两个都是单独的表 另一个表包含以下结构 我需要从表II中选择AccountNo或TempAccountNo,Mycolumn,条件是 我需要选择 我需要选择 我该如何实现。 问题答案:

  • 问题内容: 我的问题的示例架构在SQLFiddle中给出,如下所示: 在在线游戏中,我想选择对手,该对手可以在玩家或中。 所需的示例输入/输出 也就是说,所需的数据可以在任何列中,但是我需要有条件地或以任何其他方式在单列中输出。我听说过MySQL条件列,但无法创建查询以获取所需的输出。有人可以帮助您进行必要的查询吗? 编辑 基于此链接,我运行以下查询,但失败。 问题答案: 我认为您可以使用以下语法

  • 问题内容: 我正在尝试将其编译。.我有一个带有firstname和lastname字段的表,并且我有一个字符串,例如“ Bob Jones”或“ Bob Michael Jones”等。 事实是,例如我姓鲍勃,姓迈克尔·琼斯 所以我想 但是它说未知列“ firstlast” ..有人可以帮助吗? 问题答案: 您提供的别名用于查询的输出-它们本身在查询中不可用。 您可以重复表达: 或包装查询

  • 常常来说,一个play的结果经常取决于一个变量的值,事件(从远端系统得到事件),或者之前任务的结果.在有些情况下,这些变量的值也会取决于其他变量. 进而,可以建立多余的组基于这些主机是否符合某些条件来操控主机,Ansible 提供了很多不同选项,来控制执行流. 让我们详细看看这些都是啥. When 语句 有时候用户有可能需要某一个主机越过某一个特定的步骤.这个过程就可以简单的像在某一个特定版本的系

  • 问题内容: 我有一个名为@status的变量,该变量在此select语句之前设置: 我只想选择if列,否则我想为shipwith选择null。我该如何完成? 问题答案:

  • 本文向大家介绍MySQL 按列名选择,包括了MySQL 按列名选择的使用技巧和注意事项,需要的朋友参考一下 示例 询问 结果