Saya punya pertanyaan sederhana ini:

SELECT * FROM table ORDER BY ${pageSortKey:name} ${pageSortDir:raw} LIMIT ${pageLimit} OFFSET ${pageOffset}

Bagaimana cara lulus ALL untuk LIMIT ?

Sejauh yang saya pahami - ${pageLimit} diperlakukan sebagai int dan dengan demikian jika saya mencoba meneruskan argumen 'ALL' ke sana, saya mendapatkan:

"sintaks input tidak valid untuk tipe bigint: \"ALL\""

Sangat dihargai untuk membaca.

1
YS. 20 Maret 2020, 03:22

1 menjawab

Jawaban Terbaik

Yang paling sederhana adalah membuatnya menggunakan nilai secara langsung, dengan mengubah variabel menjadi ${pageLimit:raw}.

Pendekatan yang lebih aman adalah membuat jenis kustom Anda sendiri untuknya, menggunakan Jenis Kustom Memformat:

const limit = val => ({rawType: true, toPostgres: () => val ?? 'ALL'});

Kemudian berikan hasil fungsi sebagai nilai ke dalam kueri, yang akan menghasilkan:

  • limit(0) => 0
  • limit(123) => 123
  • limit() => ALL
  • limit(null) => ALL

Pendekatan kedua lebih baik, tetapi biasanya, Anda akan memilih untuk membungkus seluruh LIMIT logika ke dalamnya, dan bukan hanya nilai batas:

const limit = val => ({ rawType: true, toPostgres: () => val ? `LIMIT ${val}` : '' });

Untuk menghasilkan seluruh klausa LIMIT hanya bila ada batas aktual yang akan diterapkan:

  • limit(0) => ``
  • limit() => ``
  • limit(null) => ``
  • limit(123) => LIMIT 123

contoh:

db.any('SELECT * FROM table $1', [limit(123)]);
//=> SELECT * FROM table LIMIT 123

db.any('SELECT * FROM table ${limit}', {limit: limit(123)});
//=> SELECT * FROM table LIMIT 123
1
vitaly-t 20 Maret 2020, 06:57