【问题标题】:How to combine CONCAT() and WHERE in MariaDB?如何在 MariaDB 中结合 CONCAT() 和 WHERE?
【发布时间】:2017-08-27 21:45:45
【问题描述】:

我喜欢使用另一个查询的结果来处理列名。为此,我喜欢使用CONCAT()。但不知何故,它不起作用;当我运行这一行时,我得到了 0 行:

SELECT * FROM cover WHERE CONCAT('c','9') = 1;

当我不使用 CONCAT() 时,它可以完美运行:

SELECT * FROM cover WHERE c9 = 1;

而且CONCAT() 似乎也有效。有了这个,我得到了一个结果:

SELECT CONCAT('c','9');

我尝试了这个问题的所有解决方案: MySQL select with CONCAT condition

喜欢这个,但我总是得到 0rows 回来:

SELECT * FROM (
  SELECT id, CONCAT('c', '9') as target 
  FROM cover) base 
WHERE target = "1"

我的 MySQL 版本是; 10.1.16-MariaDB

【问题讨论】:

  • concat 生成一个字符串,它不会被解释为列名。如果您可以使用程序(例如 php、perl、python)来动态构建列名,那就更容易了。
  • @ringø 谢谢,我会考虑用 php 来做。但在这个问题中:stackoverflow.com/questions/5734570/… 看起来这是可能的。
  • 好的,谢谢您的解释...我会使用 php ;) ...是的,我想创建一个列名。

标签: mysql mariadb


【解决方案1】:

在一堆列中展开数组是糟糕的架构设计。而且,正如您所发现的,很难使用这些列。为c 值构建另一个表。

或者……

如果有很多 0/1 “列”,请考虑 SETBIGINT UNSIGNED;两者都将在一小部分空间中容纳多达 64 个布尔标志。并且,使用不同的代码,可以使用BLOB

要从 BIGINT 中提取第 22 位,((col >> 22) & 1) 将为您提供 0 或 1。

【讨论】:

  • 有趣。我喜欢设计的表有大约 100k 行和 100 到 1000 列。我必须用 1 或 0 填充每个字段。对我来说,这看起来像是使用矩阵的完美案例。你告诉我创建一个包含 10M 到 1000M 行长的 3 列(维度和值)的表更有效??
  • 我扩充了我的答案。您能否提供有关如何使用数据的更多详细信息?您是在寻找 c9 来“过滤”或“计算”还是什么?
  • 谢谢...我认为当我打开一个新问题时会更好,因为这似乎不是讨论这个问题的好地方。
【解决方案2】:

考虑使用case when,因为选项的数量是预先知道的(您只能访问存在的列):

SELECT id 
FROM   cover 
WHERE  case ? 
           when 1 then c1
           when 2 then c2
           when 9 then c9
       end = 1

...问号将是提供的值,例如您的示例中的 9。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 2021-11-24
    • 2018-10-08
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多