错误解析结果odbc查询

时间:2016-01-18 14:29:30

标签: erlang xmpp ejabberd

我有这段代码:

     case catch ejabberd_odbc:sql_query(
                     Server,
                     ["select COUNT(*) as total from users "
                      "where username='", IdUsername, "'"]) of
            {selected, [<<"total">>], [{Totale}]} ->
                io:format(Totale);
            _ ->
                io:format("err")
     end,

但始终打印“err”到控制台,但如果我使用它:

      Result = ejabberd_odbc:sql_query(Server, ["select COUNT(*) as total from users where username='", IdUsername, "';"]),
       io:format(Result),

我有这个输出:

    {badarg,[{io,format,[<0.42.0>,{selected,[<<"total">>],[[<<"1">>]]},[]],     []},{mod_http_offline,create_message,3,[{file,"mod_http_offline.erl"},     {line,35}]},{ejabberd_hooks,safe_apply,3,[{file,"src/ejabberd_hooks.erl"},     {line,382}]},{ejabberd_hooks,run1,3,[{file,"src/ejabberd_hooks.erl"},     {line,329}]},{ejabberd_sm,route,3,[{file,"src/ejabberd_sm.erl"},     {line,111}]},{ejabberd_local,route,3,[{file,"src/ejabberd_local.erl"},     {line,112}]},{ejabberd_router,route,3,[{file,"src/ejabberd_router.erl"},     {line,75}]},{lists,foreach,2,[{file,"lists.erl"},{line,1336}]}]}

我可以看到这个:

      {selected,[<<"total">>],[[<<"1">>]]}

如果我使用“total”而不是&lt;&lt;“total”&gt;&gt;相同的错误在一个案例中,那么问题是什么?我怎么能得到int数?

1 个答案:

答案 0 :(得分:1)

您的模式匹配是:

{selected, [<<"total">>], [{Totale}]}

您匹配的术语是:

{selected,[<<"total">>],[[<<"1">>]]}

也就是说,该元组中的第三个元素是一个包含二进制列表的列表,但是您要匹配包含元组的列表。

您可以通过将变量名称放在所需值的位置来获取该值,如下所示:

{selected,[<<"total">>],[[Totale]]}

将二进制分配给变量Totale。要将其转换为整数,请使用binary_to_integer/1

Count = binary_to_integer(Totale)