任何人都可以帮助解决这个错误吗?
SQL:
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total,
CASE
WHEN Total < 2.00 THEN 'Baseline Purchase'
WHEN Total BETWEEN 2.00 AND 6.99 THEN 'Low Purchase'
WHEN Total BETWEEN 7.00 AND 15.00 THEN 'Target Purchase'
ELSE 'Top Performer'
END AS PurchaseType
FROM
invoices
WHERE
PurchaseType = 'Top Performer'
ORDER BY
BillingCity
Run Code Online (Sandbox Code Playgroud)
错误:消息 207,级别 16,状态 1,第 13 行列名称“PurchaseType”无效。
AMt*_*two 11
这个错误来自于你的WHERE子句,而不是你的CASE表达式。
WHERE PurchaseType = \'Top Performer\'但是,您说PurchaseType不是表中的列,因此查询优化器不知道如何将其作为搜索谓词来处理。
有几种方法可以解决这个问题。一种选择是将表达式复制/粘贴CASE两次以同时出现在WHERE和SELECT子句中:
SELECT \n InvoiceDate, \n BillingAddress, \n BillingCity, \n Total,\n\n CASE\n WHEN Total < 2.00 THEN \'Baseline Purchase\'\n WHEN Total BETWEEN 2.00 AND 6.99 THEN \'Low Purchase\'\n WHEN Total BETWEEN 7.00 AND 15.00 THEN \'Target Purchase\'\n ELSE \'Top Performer\'\n END AS PurchaseType\n\nFROM \n invoices\nWHERE\n CASE\n WHEN Total < 2.00 THEN \'Baseline Purchase\'\n WHEN Total BETWEEN 2.00 AND 6.99 THEN \'Low Purchase\'\n WHEN Total BETWEEN 7.00 AND 15.00 THEN \'Target Purchase\'\n ELSE \'Top Performer\'\n END = \'Top Performer\'\nORDER BY \n BillingCity\nRun Code Online (Sandbox Code Playgroud)\n这有点“讨厌”,因为你在重复自己,如果你改变这个CASE表达方式,你需要在两个地方改变它。
您可以简化该子句中的逻辑WHERE,甚至不需要使用CASE,因为您过滤掉了除“最佳表现者”之外的任何内容:
SELECT \n InvoiceDate, \n BillingAddress, \n BillingCity, \n Total,\n\n CASE\n WHEN Total < 2.00 THEN \'Baseline Purchase\'\n WHEN Total BETWEEN 2.00 AND 6.99 THEN \'Low Purchase\'\n WHEN Total BETWEEN 7.00 AND 15.00 THEN \'Target Purchase\'\n ELSE \'Top Performer\'\n END AS PurchaseType\n\nFROM \n invoices\nWHERE Total > 15.00\nORDER BY \n BillingCity\nRun Code Online (Sandbox Code Playgroud)\n或者,您可以将查询弹出到 CTE 中,然后引用 CTE 来执行过滤。这将使优化器能够确定您想要计算表达式CASE,然后过滤其输出:
WITH InvoiceData AS (\n SELECT \n InvoiceDate, \n BillingAddress, \n BillingCity, \n Total,\n\n CASE\n WHEN Total < 2.00 THEN \'Baseline Purchase\'\n WHEN Total BETWEEN 2.00 AND 6.99 THEN \'Low Purchase\'\n WHEN Total BETWEEN 7.00 AND 15.00 THEN \'Target Purchase\'\n ELSE \'Top Performer\'\n END AS PurchaseType\n\n FROM \n invoices\n)\nSELECT *\nFROM InvoiceData\nWHERE\n PurchaseType = \'Top Performer\'\nORDER BY \n BillingCity\nRun Code Online (Sandbox Code Playgroud)\n编辑:\n由于我们没有表架构,上述查询均假设列Total定义为类似DECIMAL(10,2) NOT NULL. 如果该列允许NULL值,或者值比 2 位数字更精确,则CASE语句本身将需要进行其他更改。感谢ypercube\xe1\xb5\x80\xe1\xb4\xb9指出我最初没有提到这些额外的潜在陷阱。