我需要一种方法在FreeMarker中找到最少两个值,我尝试这样做,但它失败了:
WITH p as (
SELECT 2 as ID
), allFriend AS (
SELECT CASE
WHEN f.user_id = p.id THEN f.friend_id
ELSE f.user_id
END myFriend
FROM friends f, p
WHERE f.user_id = p.ID or f.friend_id = p.ID
and f.pending = 0
)
SELECT myFriend, Count(*)
FROM allfriend f
inner join friends f1
on f.myFriend = f1.user_id
OR f.myFriend = f1.friend_id
WHERE f1.pending = 0
GROUP BY myFriend
而不是在两行上打印出0.280617,我得到了这个:
<#function min a b>
<if a gt b>
<#return b />
<else>
<#return a />
</if>
</#function>
...
/* min#1 ${min(0.280617, 1.0)} */
/* min#2 ${min(1.0, 0.280617)} */
为什么呢?我该如何解决?
答案 0 :(得分:3)
<if ...>
只是静态文本(因为它不以<#
或任何其他保留模式开头),函数忽略静态文本(它们不输出任何内容),所以你的函数有刚刚在第一个#return
返回,这是无条件运行的,因为<if ...>
只是静态文本。 (非空白静态文本应该是一个错误,但是在10年以后,这将是非常向后兼容的修复...也许在2.4中会有一个选项来修复这样的事情。)
另请注意,该功能可以用更简单的形式编写(需要2.3.23):
<#function min(a, b)>
<#return (a < b)?then(a, b)>
</#function>
答案 1 :(得分:2)
叽。这是有效的:我只是不知道为什么......如果我使用<#if>
而不是<if>
,我曾经在函数末尾从Freemarker收到错误。现在它似乎工作正常。
<#function min a b>
<#if a gt b>
<#return b />
<#else>
<#return a />
</#if>
</#function>