以下可能吗?
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中甚至有可能吗?
答案 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;
答案 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语句。
另一种方法是设计一个表达式,该表达式包括对多个列的静态引用,包括该表达式中的逻辑,该逻辑确定应从哪个静态列引用中返回一个值。