在“IN”子句中查找与记录不匹配的值
问题描述:
我有一个dept
表,其中有eng
和finance
记录。它不包含foo
,bar
或baz
的记录。我有一个hibernate查询返回符合我要找的记录。它看起来像:在“IN”子句中查找与记录不匹配的值
select * from dept where dept.name in (eng, foo, bar, baz, finance);
查询工作正常和做什么,我需要做的(发现eng
和finance
)。但是,我还需要打印出日志信息对于那些没有匹配记录(foo
,bar
和baz
)认为:
log.debug ("could not find records where dept.name in foo, bar, baz");
有没有一种简单的方法在Hibernate中做到这一点?
从我所看到的,唯一的解决方案是使所有的假设值的一些结构,并删除查询发现的东西。
答
Select * from dept where dept.name not in (eng, foo, bar, baz, finance)
答
你可以只CONCAT字段名称,并将得到的名单将有什么你想打印的错误:
select
dept.name as name,
CONCAT(
case
when !eng
then 'eng, '
else ''
end,
case
when !foo
then 'foo, '
else ''
end,
case
when !bar
then 'bar, '
else ''
end,
case
when !baz
then 'baz, '
else ''
end,
case
when !finance
then 'finance'
else ''
end) as errorFields
from dept where dept.name not in (eng, foo, bar, baz, finance)
未经检验的,只是想给你的总体思路,和IM不相当肯定,如果我undestand你所要求的。
答
你不说出你的DBMS,所以这是ANSI SQL:
with names (dname) as (
values
('eng'),
('foo'),
('bar'),
('baz'),
('finance')
)
select n.dname
from names as n
left join depts as d on d.name = n.dname
where d.name is null;
答
老实说,可能会有一些肮脏的把戏做到这使得它看起来像是直接在查询工作,但为什么做查询不可维护,并在数据访问层中放入不必要的业务逻辑?这是非常直接的代码完成。
在伪代码它仅仅是这样的:
List<Department> searchByDeptNames(List<String> deptNames) {
List<Department> depts =
session.createQuery("from dept where dept.name in (:deptNames)")
.setParameter("deptNames", deptNames)
.list();
// log down unmatched dept names
if (logger.isDebugEnabled()) {
Set<String> unmatchedDeptNames = new HashSet<String>(deptNames);
for (Department dept : depts) {
inputDeunmatchedDeptNames.remove(dept.getName());
}
logger.debug("no record found for dept names : " + unmatchedDeptNames);
}
return depts;
}
查询会,如果你打算在运行时in
条款的值传递甚至更加杂乱。
答
由于a_horse_with_no_name points out,您没有声明您的DBMS。这是一个SQL Server 2008解决方案:
select input.name
from (values
('eng'),
('foo'),
('bar'),
('baz'),
('finance')
)[input](name)
left join depts d on d.name = input.name
where d.name is null
但由于没有记录,它应该返回0行不,有foo的酒吧或巴兹没有记录 – 2013-05-09 20:48:41
你能更详细?我很困惑 - 可能会显示一些示例数据和示例输出。 – Randy 2013-05-09 21:00:04
我需要知道“in”子句中哪些内容与任何记录不匹配。你在这里给我的所有记录都不在XXXX中 – 2013-05-09 21:06:14