我正在寻求有关我的Rose::D B问题的帮助,如下所述。
我有一个帐户对象,它有一个整数"帐户类型"字段。在此示例中,我将使用以下帐户类型常量:
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'
]
);
但是,我还没有找到任何方法可以做到这一点。任何帮助或建议非常欢迎。
谢谢!
假设您的 SQL 服务器了解以下内容:
(accounttype & 16) <> 0
然后,这将建议您可以使用以下内容:
[ '(accounttype & ?) <> 0' => ACCOUNT_TYPE_SPECIAL_MASK ]
在这种情况下,您可以内联常量。
sprintf('(accounttype & %d) <> 0', ACCOUNT_TYPE_SPECIAL_MASK)
我不知道这两个版本是否会导致不同的 SQL,如果这样,我不知道哪个更快。