Sql 在“中查找值”;在;与记录不匹配的子句
我有一个Sql 在“中查找值”;在;与记录不匹配的子句,sql,hibernate,Sql,Hibernate,我有一个dept表,其中有eng和finance记录。它不包含foo、bar或baz的记录。我有一个hibernate查询,它返回与我要查找的内容匹配的记录。它看起来像: select * from dept where dept.name in (eng, foo, bar, baz, finance); 查询工作正常,完成了我需要它做的事情(查找eng和finance)。但是,我还需要为那些不匹配的记录打印日志消息(foo、bar和baz): log.debug(“在foo、bar、baz
dept
表,其中有eng
和finance
记录。它不包含foo
、bar
或baz
的记录。我有一个hibernate查询,它返回与我要查找的内容匹配的记录。它看起来像:
select * from dept where dept.name in (eng, foo, bar, baz, finance);
查询工作正常,完成了我需要它做的事情(查找eng
和finance
)。但是,我还需要为那些不匹配的记录打印日志消息(foo
、bar
和baz
):
log.debug(“在foo、bar、baz中找不到dept.name所在的记录”);
在hibernate中有没有一种简单的方法可以做到这一点
据我所见,唯一的解决方案是使用所有假设值创建一些结构,并删除查询找到的内容。您可以只对字段名称进行合并,结果列表将完全包含您希望打印为错误的内容:
Select * from dept where dept.name not in (eng, foo, bar, baz, finance)
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)
未经测试,只是想给你一个大概的想法,我不太确定我是否理解你的要求。你没有说明你的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 searchByDeptNames(List deptNames){
列表部门=
session.createQuery(“从dept.name所在的部门(:deptNames)”)
.setParameter(“deptNames”,deptNames)
.list();
//记录不匹配的部门名称
if(logger.isDebugEnabled()){
Set unmatchedDeptNames=新哈希集(deptNames);
适用于(部门:部门){
inputDeunmatchedDeptNames.remove(dept.getName());
}
logger.debug(“未找到部门名称的记录:“+unmatchedDeptNames”);
}
返回部门;
}
如果您打算在运行时在子句中传递的值,那么查询将更加混乱。因为您没有声明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-bar或baz没有记录。您能详细说明一下吗?我很困惑-可能会显示一些示例数据和示例输出。?我需要知道“in”子句中哪些内容与任何记录不匹配。你这里有什么是给我所有的记录,不是在xxxxin条款可能或可能不匹配的记录。我需要知道“IN”子句的哪些值与任何记录不匹配