Saya menggunakan node.js dan mencoba membuat kueri berdasarkan beberapa filter jika saja itu benar

select * from orders ${isFilter ? 'where' : ''} 
    ${orderId !== undefined && orderId ? `order_id = '${orderId}' or ` : '' }
    ${receiptId !== undefined && receiptId? `receipt_id = '${receiptId}' or `: '' }
    ${driver !== undefined && driver ? `driver_id = '${Number(driver)}'` : '' }

Ini berfungsi dengan baik jika tidak ada filter atau ketika semua filter benar tetapi OR menyebabkan masalah ketika satu filter atau lebih tidak ada. apa cara terbaik untuk menangani ini?

3
Ahmed Imam 21 September 2021, 14:14

5 jawaban

Jawaban Terbaik

Ini adalah kode semu untuk menyusun kueri secara dinamis

var clause = 'where';
var query = 'select * from orders';
if (isFilter) { // this statement could be removed
    if (orderId !== undefined && orderId) {
        query += clause + ' order_id = `${orderId}`';
        clause = 'or';
    }
    if (receiptId !== undefined && receiptId) {
        query += clause + ' receiptId = `${receiptId}`';
        clause = 'or';
    }
    if (driver !== undefined && driver) {
        query += clause + ' driver = `${driver}`';
        clause = 'or'; // this is not really needed, but it could be useful for further filters in future
    }
}
3
lubilis 21 September 2021, 11:29
let whereClause = [];

if(orderId) whereClause.push(`order_id = '${orderId}'`);
if(receiptId) whereClause.push(`receipt_id = '${receiptId}'`);
if(driver) whereClause.push(`driver_id = ${parseInt(driver)}`);

let whereQuery = whereClause.join(' OR ');

let sql = `select * from orders where true ${whereClause.length ? whereQuery : ''}`;

Coba pakai gabung sehingga Anda dapat menambahkan banyak properti meskipun tidak berurutan. Juga jika Anda mengharapkannya tidak terdefinisi, maka Anda dapat menghapusnya karena menghasilkan pernyataan kondisi yang salah.

1
Arjay Bonus 21 September 2021, 11:51

Saya pikir masuk akal jika Anda dapat mencatat kueri. kita bisa yakin tentang kueri yang dikirim. Ini akan menjadi langkah pertama untuk memecahkan masalah dan mungkin kami dapat menggunakan cara Anda mencoba menggunakan operator ternary dengan sedikit perubahan.

0
Arun Kumar 21 September 2021, 11:34

Kode yang Anda gunakan di atas untuk membuat string kueri tidak mungkin mencakup semua kemungkinan kasus.

Contoh: Bagaimana jika isFilter==false dan salah satu dari 3 variabel orderId, receiptId dan driver memiliki nilai !== undefined? => kueri Anda akan salah karena pernyataan WHERE tidak ada.

Lain halnya jika salah satu variabel orderId atau receiptId memenuhi syarat dan variabel driver tidak valid. => Permintaan Anda akan salah karena tambahan 'ATAU' di akhir.

Itu adalah 2 kasus yang paling mungkin menyebabkan masalah untuk kode di atas. Inilah saran saya untuk menyelesaikan masalah Anda:

queryString="select * from orders"

if(isFilter){
  queryString+=' where'
  if(orderId){
    queryString+=' ..... or'
  }
  if(receiptId){
    queryString+=' ..... or'
  }
  if(driver){
    queryString+=' .....'
  }
}
queryString=queryString.trim()
if(queryString.endsWith('or')){
    queryString=queryString.substring(0,queryString.length-2)
}
if(queryString.endsWith('where')){
    queryString=queryString.substring(0,queryString.length-5)
}
0
Quoc Tuan 21 September 2021, 11:47
    select * from orders ${isFilter ? 'where 1=0' : ''} 
        ${orderId !== undefined && orderId ? `OR order_id = '${orderId}'  ` : '' }
        ${receiptId !== undefined && receiptId? `OR receipt_id = '${receiptId}' `: '' }
        ${driver !== undefined && driver ? `OR driver_id = '${Number(driver)}'` : '' }

Sebaliknya jika DAN Anda dapat melakukan 1=1 alih-alih 1=0.

0
shadow0359 21 September 2021, 12:04