Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Lọc dữ liệu SQLite Android với WHERE IN

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)

Lọc dữ liệu SQLite Android với WHERE IN

IN vs BETWEEN vs NOT IN

⚠️ Lưu ý NULL với IN/NOT IN

  • value IN (1, 2, NULL) → TRUE nếu value=1 hoặc 2, UNKNOWN nếu value=3 (không FALSE)
  • value NOT IN (1, 2, NULL) → LUÔN UNKNOWN (không bao giờ TRUE) do logic 3 giá trị SQL
  • Giải pháp: Luôn lọc NULL: WHERE salary IN (10, 10000) AND salary IS NOT NULL

Dynamic IN list (từ code Java)

List<Integer> allowedSalaries = Arrays.asList(10, 5000, 10000);
String placeholders = String.join(",", Collections.nCopies(allowedSalaries.size(), "?"));
// "?, ?, ?"
String sql = "SELECT * FROM " + TABLE_NAME + " WHERE salary IN (" + placeholders + ")";
Cursor cursor = db.rawQuery(sql, allowedSalaries.stream().map(String::valueOf).toArray(String[]::new));
Toán tửÝ nghĩaVí dụ
INKhớp một trong danh sách rời rạcstatus IN ('active','pending')
BETWEENTrong khoảng liên tụcage BETWEEN 18 AND 65
NOT INKhông khớp bất kỳ giá trị nàoid NOT IN (1,2,3)