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

时间:2018-10-11 16:43:32

标签: mysql

我觉得之前已经做过,但是缺少一些东西。我正在检查一个继承的数据库,并希望查看一堆DISTINCT值。我以为我可以做这样的事情,而不是多次写cf_840(或任何数字),而只是一次更改实际的字段名称...

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

但这不能正常工作,我觉得我缺少一些简单的东西,但是找不到在SO上搜索的正确东西。

2 个答案:

答案 0 :(得分:1)

在动态构造查询之外,不能使用变量直接指定字段。充其量,您可以有条件地从字段中选择一个值,例如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 Proc样式:SET query := 'SELECT ' + fieldName + ', COUNT(DISTINCT ' + fieldName.....and so on,然后是PREPARE和EXECUTE。


编辑:我不确定为什么要选择@var如果要获取其值的计数。我猜想您希望结果中包含字段名称,因此示例可能更适合作为SELECT '{0}' as theField, COUNT(DISTINCT {0}) AS counter ...和'SELECT'''+ fieldName +'''AS fieldName,COUNT(DISTINCT'+ fieldName ... .`

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

答案 1 :(得分:-1)

要在当前查询中使用变量,请在SELECT主体中声明它

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