gpt4 book ai didi

mysql - 根据 MySQL 中的特定情况查找列的平均长度

转载 作者:行者123 更新时间:2023-11-29 13:36:04 25 4
gpt4 key购买 nike

我有一个用户表和另一个他们发送的消息表,我正在尝试查找消息的平均长度以及用户退休时消息的平均长度。如果我尝试这个:

SELECT u.id, 
AVG(LENGTH(m.body)) AS avg_msg_length,
AVG(LENGTH(CASE m.is_retired WHEN true THEN m.body ELSE NULL END)) AS avg_msg_length_retired
FROM Users u LEFT OUTER JOIN Messages m
ON u.id = m.sender_id
GROUP BY u.id;

在结果中,我得到了平均长度,但退休人员的平均长度只是一列 NULL。

如果我尝试这个:

SELECT u.id, 
AVG(LENGTH(m.body)) AS avg_msg_length,
AVG(LENGTH(CASE m.is_retired WHEN "true" THEN m.body ELSE NULL END)) AS avg_msg_length_retired
FROM Users u LEFT OUTER JOIN Messages m
ON u.id = m.sender_id
GROUP BY u.id;

我明白了,

ERROR 1054 (42S22): Unknown column '“true”' in 'field list'.

我发现这非常奇怪,因为 is_retired 字段是 varchar。

我是否在 LENGTH 内错误地使用了 CASE WHEN?我也尝试了第二种形式的 CASE WHEN :

 AVG(LENGTH(CASE WHEN m.is_retired=true THEN m.body ELSE NULL END)) AS avg_msg_length_retired 

并且,

AVG(LENGTH(CASE WHEN m.is_retired="true" THEN m.body ELSE NULL END)) AS avg_msg_length_retired 

得到与上面相同的结果。

最佳答案

我更喜欢case内的length():

SELECT u.id, 
AVG(LENGTH(m.body)) AS avg_msg_length,
AVG(CASE WHEN m.is_retired = 'Y' THEN LENGTH(m.body) END) AS avg_msg_length_retired
FROM Users u LEFT OUTER JOIN
Messages m
ON u.id = m.sender_id
GROUP BY u.id;

'Y' 应该是表示真实情况的任何字符或字符串。

您的查询的问题在于您将字符表达式 (is_retired) 与数字表达式 (true) 混合在一起。与类型保持一致。

例如,其计算结果为 false:

 select 'true' = true;

但这评估为 true:

select 1 = true;

关于mysql - 根据 MySQL 中的特定情况查找列的平均长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18729597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com