SQL在满足条件的每一行上执行操作

时间:2018-01-11 20:41:18

标签: mysql sql

Here is the sqlfiddle

我目前正试图通过特定邮政编码通配符平均租金。例如,如果20000的邮政编码具有租金值0,则它将替换插入与“20%”通配符匹配的(非零)邮政编码的平均租金。然而,目前,它平均所有租金,无论通配符如何。这是我得到的:

rent    zip
2375    20000
1000    20001
2000    20002
5000    30000
1500    20003
2375    30001

但这就是我想要的:

rent    zip
1500    20000
1000    20001
2000    20002
5000    30000
1500    20003
5000    30001

这是我当前的查询:

SELECT IF(tmp.rent=0, 
          (select AVG(rent) from tmp where rent > 0 and zip LIKE CONCAT(substr(zip,1,2),'%')), 
          tmp.rent) as rent, 
       zip 
from tmp

1 个答案:

答案 0 :(得分:1)

对于zip的所有非空值,这个表达式的评估为TRUE,换句话说,"所有这些"" ?

 zip LIKE CONCAT(substr(zip,1,2),'%'))

似乎您希望限定其中一个列引用,因此它引用外部查询中的列。确定所有列参考资料是一种很好的做法。

SELECT IF( t.rent=0
         , ( SELECT AVG(s.rent)
               FROM tmp s
              WHERE s.rent > 0
                AND s.zip LIKE CONCAT(SUBSTR(t.zip,1,2),'%')
           )
         , t.rent
       ) AS rent
     , t.zip 
  FROM tmp t