Mục tiêu
Sử dụng mệnh đề WHERE column IN (value1, value2, ...) để lọc bản ghi có giá trị cột nằm trong danh sách cho trước.
Ví dụ thực tế
Lấy nhân viên có lương bằng 10 HOẶC 10000 (lương cấp bậc cụ thể).
Các bước thực hiện
Bước 1-2: Tạo dự án & Layout (giống các bài trước)
Bước 3: DatabaseHelper.java - Truy vấn IN
package com.example.sqlitein;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "salaryDatabase3";
private static final String TABLE_NAME = "SalaryDetails";
private static final int VERSION = 1;
DatabaseHelper(Context context) {
super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY, name TEXT, salary TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
boolean insert(String name, String salary) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", name);
cv.put("salary", salary);
return db.insert(TABLE_NAME, null, cv) != -1;
}
// TRUY VẤN CHÍNH: WHERE salary IN ('10', '10000')
ArrayList<String> getAllContacts() {
SQLiteDatabase db = getReadableDatabase();
ArrayList<String> list = new ArrayList<>();
Cursor cursor = db.rawQuery(
"SELECT * FROM " + TABLE_NAME + " WHERE salary IN ('10', '10000')",
null
);
if (cursor.moveToFirst()) {
do {
list.add(cursor.getString(cursor.getColumnIndexOrThrow("name")));
} while (cursor.moveToNext());
}
cursor.close();
return list;
}
}
Giải thích IN
- Tương đương:
WHERE salary = '10' OR salary = '10000' - Ngắn gọn, dễ đọc, dễ bảo trì hơn OR chain dài
- Danh sách có thể là subquery:
WHERE dept_id IN (SELECT id FROM departments WHERE active=1) - Hiệu năng: SQLite tối ưu IN list nhỏ thành binary search. List lớn (>1000) cân nhắc temp table hoặc JOIN
Kết quả
Nhập: ("A", "10"), ("B", "5000"), ("C", "10000"), ("D", "20000")
Kết quả: A, C (chỉ lương chính xác 10 hoặc 10000)

IN vs BETWEEN vs NOT IN
| Toán tử | Ý nghĩa | Ví dụ |
|---|---|---|
| IN | Khớp một trong danh sách rời rạc | status IN ('active','pending') |
| BETWEEN | Trong khoảng liên tục | age BETWEEN 18 AND 65 |
| NOT IN | Không khớp bất kỳ giá trị nào | id NOT IN (1,2,3) |