我正在针对我的Rose :: DB问题寻求帮助,如下所述。
我有一个帐户对象,它有一个整数的“帐户类型”字段。在此示例中,我将使用以下帐户类型常量:
ACCOUNT_TYPE_SPECIAL_MASK = 0x10;
ACCOUNT_TYPE_SPECIAL_1 = 0x10;
ACCOUNT_TYPE_SPECIAL_2 = 0x11;
ACCOUNT_TYPE_NORMAL_MASK = 0x20;
ACCOUNT_TYPE_NORMAL_1 = 0x20;
ACCOUNT_TYPE_NORMAL_2 = 0x21;
目前,当我想要给定类型的帐户时,我会列出所有帐户并执行以下操作:
my $iter = Test::Account::Manager->get_accounts_iterator(
db => $db,
query =>
[
'accounttype' => [ ACCOUNT_TYPE_SPECIAL_1, ACCOUNT_TYPE_SPECIAL_2 ],
]
);
但是,我希望能够使用适当的掩码查询帐户,而不是指定所有可能的类型。
我想说:
my $iter = Test::Account::Manager->get_accounts_iterator(
db => $db,
query =>
[
'accounttype' => 'accounttype & ACCOUNT_TYPE_SPECIAL_MASK'
]
);
但是,我还没有发现执行此操作的任何方法。任何帮助或建议都非常欢迎。
谢谢!
答案 0 :(得分:1)
假设您的SQL Server了解以下内容:
(accounttype & 16) <> 0
This然后会建议您使用以下内容:
[ \'(accounttype & ?) <> 0' => ACCOUNT_TYPE_SPECIAL_MASK ]
在这种情况下,您可以内联常量。
\sprintf('(accounttype & %d) <> 0', ACCOUNT_TYPE_SPECIAL_MASK)
我不知道这两个版本是否导致不同的SQL,如果这样,我也不知道哪个更快。