查询语句中的Rose :: DB掩码

时间:2019-09-12 21:38:49

标签: sql perl rose-db-object

我正在针对我的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'
    ]
);

但是,我还没有发现执行此操作的任何方法。任何帮助或建议都非常欢迎。

谢谢!

1 个答案:

答案 0 :(得分:1)

假设您的SQL Server了解以下内容:

(accounttype & 16) <> 0

This然后会建议您使用以下内容:

[ \'(accounttype & ?) <> 0' => ACCOUNT_TYPE_SPECIAL_MASK ]

在这种情况下,您可以内联常量。

\sprintf('(accounttype & %d) <> 0', ACCOUNT_TYPE_SPECIAL_MASK)

我不知道这两个版本是否导致不同的SQL,如果这样,我也不知道哪个更快。