3

とレコードのdeptテーブルがあります。、またはのレコードが含まれていません。探しているものと一致するレコードを返す休止状態のクエリがあります。次のようになります。engfinancefoobarbaz

select * from dept where dept.name in (eng, foo, bar, baz, finance);

クエリは正常に機能しており、必要なことを実行します (検索engfinance)。ただし、レコードに一致しないもの ( foobar、およびbaz)のログ メッセージも出力する必要があります。

log.debug ("could not find records where dept.name in foo, bar, baz");

休止状態でこれを行う簡単な方法はありますか?

私が見る限り、唯一の解決策は、すべての仮想値を使用して何らかの構造を作成し、クエリで見つかったものを削除することです。

4

5 に答える 5

3

a_horse_with_no_name が指摘しているように、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
于 2016-04-22T19:42:20.873 に答える
1

あなたはあなたの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;
于 2013-05-09T21:57:10.347 に答える
0

正直なところ、クエリで直接機能しているように見えるいくつかの汚いトリックがあるかもしれませんが、なぜクエリを維持できなくし、不要なビジネス ロジックをデータ アクセス レイヤーに置くのでしょうか? コードで実行するのは非常に簡単です。

疑似コードでは、次のようなものです。

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実行時に句の値を渡す場合、クエリはさらに複雑になります。

于 2013-05-10T01:47:50.733 に答える
0

フィールド名を 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)

テストされておらず、一般的なアイデアを提供しようとしているだけであり、あなたが求めたものを理解していないかどうかはよくわかりません.

于 2013-05-09T21:48:54.067 に答える
0
Select * from dept where dept.name not in (eng, foo, bar, baz, finance)
于 2013-05-09T20:44:57.017 に答える