先日の見本が間違っていることが発覚。先日のやつはこんな指定だった。
p = [NSPredicate predicateWithFormat: @"ANY books.date >= %@ AND ANY books.date < %@", date1, date2]この時の SQLはこうなる。
SELECT DISTINCT 0, t0.Z_PK FROM ZAUTHOR t0 JOIN ZBOOK t1 ON t0.Z_PK = t1.ZAUTHOR JOIN ZBOOK t2 ON t0.Z_PK = t2.ZAUTHOR WHERE ( t1.ZDATE >= ? AND t2.ZDATE < ?)よくよく考えると同じテーブルではあるが、別個に結合(JOIN)しているので、WHERE句の AND 条件が意図通りに働かない。実際、テストしていて意図しないレコードがヒットするのに気がついた。これは WHERE句内の2つの条件が(元は同じだが)別のテーブル(集合)として扱われる為。 ただ先日示したように ANY(条件 AND 条件) は使えない(パースエラーになる)。この場合 SUBQUERY を使う。SUBQUERYを使って書くと先ほどの設定はこうなる。
p = [NSPredicate predicateWithFormat: @"SUBQUERY(books, $s, $s.date >= %@ AND $s.date < %@).@count > 0", date1, date2];SQLはこうなる。
SELECT 0, t0.Z_PK FROM ZCUSTOMER t0 WHERE (SELECT COUNT(*) FROM ZKARTE t1 WHERE (t0.Z_PK = t1.ZCUSTOMER AND (( t1.ZTREATEDDATE >= ? AND t1.ZTREATEDDATE < ?))) ) > ?これなら問題ない。実際の動作でも意図通りとなった。
参考情報
iphone - Core Data ANY BETWEEN predicate - Stack Overflow
まったく同じ問題で困っていた人がいた。
Responses
Leave a Response