查询动态mysql列

时间:2018-08-16 15:04:12

标签: mysql sql dynamic

以下可能吗?

SELECT f.*, (SELECT QUERY WHICH PULLS OUT A STRING VALUE) AS record_type
FROM foo f
AND f.record_type > 0

基本上,我想查询动态列。我也尝试了以下两种方法,但都没有运气:

SELECT f.*
FROM foo f
AND f.(SELECT QUERY WHICH PULLS OUT A STRING VALUE) > 0

在mysql中甚至有可能吗?

3 个答案:

答案 0 :(得分:1)

您可以动态构建查询:

CREATE TABLE foo(id INT, record_type INT, a VARCHAR(2), b VARCHAR(2));

INSERT INTO foo(id, record_type, a, b)
VALUES (1,1,'a', 'a'), (2,0,'b', 'b'), (3,1, 'c', 'c');

SET @cols := (SELECT 'a'); -- or some select from metadata tables,
                           -- should be comma separated
SET @sql:= REPLACE('SELECT <cols> FROM foo f
                    WHERE f.record_type > 0', '<cols>', @cols);
PREPARE dynamic_statement FROM @sql;
EXECUTE dynamic_statement;
DEALLOCATE PREPARE dynamic_statement;

Rextester Demo

答案 1 :(得分:1)

有些疯狂的过程混合在一起可能是可行的,但并不常见,我建议您不要这样做,因为这会引起很大的安全漏洞。

使用简单查询或带有绑定的预备语句绝对不可能。 您可以在select命令中创建一个case块,以确定要使用的列,但仅此而已。

答案 2 :(得分:1)

尚不清楚我们正在尝试做什么。

是的,我们可以在SELECT列表中包含一个子查询。 (限制是子查询必须返回一个列,并且返回的行不得超过一行)。这将是返回的

返回的值将解释为对外部查询中列的引用。

我们可以在HAVING子句中引用子查询返回的值,例如

 SELECT f.id 
      , ( SELECT t.fee FROM t WHERE t.fi = 'fo' LIMIT 1 ) AS fum
   FROM f
 HAVING fum > 0

请注意,我们无法在查询的WHERE子句中引用fum

还请注意,fum不是f.中的一列,因此我们不将fum限定为f

我们可以使查询成为内联视图,然后外部查询可以在fum子句中引用WHERE

但是,就效率而言,所有这些都不理想。查询将访问f中的行,并且在访问所有行之后,稍后将应用HAVING子句中的条件。

再次...子查询返回的值是一个,它会在结果集中返回;不会被解释为对f中的列的引用。

除非这是一个相关的子查询,否则子查询将为f中的每一行返回相同的值,因此它实质上是一个文字值。

如果这是一个相关子查询(包括对外部查询中f的列的引用),则很可能JOIN操作会更好地满足规范。

同样,我们要达到的目标还不是很清楚。


如果目标是对某个列的 dynamic 引用,则不会,在单个SQL语句中无法实现。

要使用SQL动态生成列引用,需要使用单独的 SQL语句,然后使用该结果即可生成我们要运行的SQL语句。

另一种方法是设计一个表达式,该表达式包括对多个列的静态引用,包括该表达式中的逻辑,该逻辑确定应从哪个静态列引用中返回一个值。