SET 变量用作查询中的字段?



我觉得我以前做过这个,但错过了一些东西。我正在浏览我继承的数据库,并希望看到一堆 DISTINCT 值。我想我可以做这样的事情,而不是写很多次cf_840(或任何数字(,然后在一个地方更改实际的字段名称......

SET @var = 'cf_840';
SELECT DISTINCT @var, COUNT(@var) AS counter 
FROM vtiger_leadscf 
GROUP BY @var 
ORDER BY @var;

但这不起作用,我觉得我错过了一些简单的东西,但找不到正确的东西来搜索 SO。

不能使用变量直接指定动态构造查询之外的字段;充其量只能有条件地从字段中选择一个值,例如CASE @var WHEN 840 THEN cf_840 WHEN 1 THEN cf_1 .... etc END AS fieldVal

否则,您需要将字段名称"baked"动态构造到要执行的查询中。

C# 样式:var query = String.Format("SELECT {0}, COUNT(DISTINCT {0}) AS counter FROM .... blah blah blah", fieldName);

SQL 处理样式:SET query := 'SELECT ' + fieldName + ', COUNT(DISTINCT ' + fieldName.....and so on,然后准备并执行。


编辑:我不确定为什么要选择@var,如果你得到它的值计数。我猜您希望结果中包含字段名称,所以也许示例会更好,因为SELECT '{0}' as theField, COUNT(DISTINCT {0}) AS counter ...和"选择"+字段名称+"作为字段名称,计数(不同"+字段名称....">

此外,您不需要 GROUP BY 或 ORDER BY 子句,这些查询将只有一个结果行。

要在当前查询中使用变量,请在 SELECT 的正文中声明该变量

SELECT DISTINCT @var := 'cf_840' AS fieldName, COUNT(@var) AS counter 
FROM vtiger_leadscf
GROUP BY fieldName 
ORDER BY counter;

最新更新