查询动态 mysql 列



以下可能吗?

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 中甚至可能吗?

目前还不完全清楚我们试图做什么。

是的,我们可以在 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中的列。

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

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

再。。。子查询返回的值是在结果集中返回的值;这不会被解释为对 F 中列的引用。

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

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

同样,我们想要实现的目标并不完全清楚。


如果目标是对列的动态引用,则不可以,这无法在单个 SQL 语句中实现。

要使用 SQL 动态生成列引用,这需要一个单独的SQL 语句,然后其结果可用于生成我们想要运行的 SQL 语句。

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

您可以动态构建查询:

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 演示

通过一些疯狂的程序混合,这可能是可能的,但不常见,我建议你不要这样做,因为它会导致一个很大的安全漏洞。

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

最新更新