我使用Oracle SQL并有一个这样的表:
CREATE table MY_TABLE(
MY_ID RAW(16) NOT NULL CONSTRAINT MY_ID PRIMARY KEY,
MY_BOOLEAN NUMBER DEFAULT 1 NOT NULL,
MY_NAME NUMBER NOT NULL
);
MY_BOOLEAN
可以是0
(表示错误)或1
(表示正确)。
我的应用可以使用NamedQuery
搜索值。这看起来像这样:
import javax.persistence.NamedQuery;
...
@NamedQuery(
name = "MyTable.listAllMatching",
query = "SELECT COUNT(t) FROM MyTable t WHERE "
+ "LOWER(t.id) LIKE LOWER(:filter) OR "
+ "LOWER(t.myBoolean) LIKE LOWER(:filter) OR "
+ "LOWER(t.myName) LIKE LOWER(:filter)"
)
如果我搜索名称,它可以工作。如果我搜索true
,我想获取MY_BOOLEAN
为1
的所有行。 false
和0
也是如此。我不能只搜索0
或1
,因为例如,当我搜索0
时,我的0
中的每一行都会MY_ID
}。
是否有办法使用包装函数或其他任何内容将true
或false
:filter
转换为0
或1
仅用于{{ 1}?或者有更好的方法吗?
答案 0 :(得分:0)
您的查询应该有所不同。通过将MY_BOOLEAN和MY_NAME声明为数字,然后在查询中使用LOWER,您将导致数字显式转换为VARCHAR。试试这个
query = "SELECT COUNT(t) FROM MyTable t WHERE "
+ "(LOWER(t.id) LIKE LOWER(:filter1) "
+ " OR LOWER(t.my_Name) LIKE LOWER(:filter1))"
+ " t.my_Boolean = :filter2"
通过在OR周围放置括号,您可以选择并使用MyBoolean作为数字比较,它可以作为整体过滤器
在重新阅读你想要做的事情后,我认为你需要两个过滤器,一个用于文本,声明为CHAR,一个用于MyBoolean和my_name。
除此之外,您可以通过不同的方式命名列来更清晰
my_name => my_name_id
my_boolean => enabled