Mengapa seseorang akan menggunakan WHERE 1=1 AND <conditions>
klausa SQL (Entah SQL diperoleh melalui string gabungan, baik definisi tampilan)
Saya telah melihat di suatu tempat bahwa ini akan digunakan untuk melindungi terhadap SQL Injection, tetapi tampaknya sangat aneh.
Jika ada injeksi WHERE 1 = 1 AND injected OR 1=1
akan memiliki hasil yang sama dengan injected OR 1=1
.
Sunting nanti: Bagaimana dengan penggunaan dalam definisi tampilan?
Terima kasih atas jawaban anda
Namun, saya tidak mengerti mengapa seseorang menggunakan konstruksi ini untuk mendefinisikan tampilan, atau menggunakannya dalam prosedur tersimpan.
Ambil ini sebagai contoh:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
sql
dynamic-sql
Bogdan Maxim
sumber
sumber
Jawaban:
Jika daftar kondisi tidak diketahui pada waktu kompilasi dan sebagai gantinya dibangun pada waktu berjalan, Anda tidak perlu khawatir apakah Anda memiliki satu atau lebih dari satu kondisi. Anda dapat menghasilkan semuanya seperti:
dan menyatukan semuanya. Dengan
1=1
di awal, inisialand
memiliki sesuatu untuk dikaitkan.Saya belum pernah melihat ini digunakan untuk segala jenis perlindungan injeksi, seperti yang Anda katakan sepertinya tidak akan banyak membantu. Saya telah melihatnya digunakan sebagai kenyamanan implementasi. Mesin query SQL pada akhirnya akan mengabaikan
1=1
sehingga seharusnya tidak memiliki dampak kinerja.sumber
where 1=1
(Oracle) atauwhere true
(Postgres), saya harus memeriksa setiap kondisi apakah itu yang pertama. Tidak ada gunanya melakukannya, dan itu hanya menambah kode boilerplate.Hanya menambahkan kode contoh ke jawaban Greg:
sumber
Saya pernah melihatnya digunakan ketika jumlah kondisi dapat bervariasi.
Anda dapat menggabungkan kondisi menggunakan string "DAN". Kemudian, alih-alih menghitung jumlah kondisi yang Anda lewati, Anda menempatkan "WHERE 1 = 1" di akhir pernyataan SQL stok Anda dan melemparkan pada kondisi gabungan.
Pada dasarnya, ini menghemat Anda harus melakukan tes untuk kondisi dan kemudian menambahkan string "DI MANA" sebelum mereka.
sumber
Sepertinya cara malas untuk selalu tahu bahwa klausa WHERE Anda sudah ditentukan dan memungkinkan Anda untuk terus menambahkan kondisi tanpa harus memeriksa apakah itu yang pertama.
sumber
where 1=1
(Oracle) atauwhere true
(Postgres), saya harus memeriksa setiap kondisi apakah itu yang pertama. Tidak ada gunanya melakukannya, dan itu hanya menambah kode boilerplate.WHERE 1=1
menghasilkan pekerjaan ekstra menjaga kode yang sama di banyak tempat dan membacanya di semua SQL yang Anda hasilkan. Saya lebih malas dari Anda saya pikir!Relevan Tidak Langsung: ketika 1 = 2 digunakan:
ini akan membuat tabel baru dengan skema yang sama dengan tabel lama. (Sangat berguna jika Anda ingin memuat beberapa data untuk perbandingan)
sumber
1 = 1 ekspresi umum digunakan dalam kode sql yang dihasilkan. Ungkapan ini dapat menyederhanakan kode menghasilkan sql mengurangi jumlah pernyataan bersyarat.
sumber
Sebenarnya, saya pernah melihat hal semacam ini digunakan dalam laporan BIRT. Kueri yang diteruskan ke runtime BIRT adalah dalam bentuk:
dan '?' diganti pada saat runtime oleh nilai parameter aktual yang dipilih dari kotak drop-down. Pilihan dalam drop-down diberikan oleh:
sehingga Anda mendapatkan semua nilai yang mungkin plus "
*
". Jika pengguna memilih "*
" dari kotak drop down (artinya semua nilai a harus dipilih), kueri harus dimodifikasi (dengan Javascript) sebelum dijalankan.Sejak "?" adalah parameter posisi dan HARUS tetap ada untuk hal lain berfungsi, Javascript memodifikasi kueri menjadi:
Itu pada dasarnya menghilangkan efek klausa di mana sementara masih meninggalkan parameter posisi di tempatnya.
Saya juga melihat kasus AND yang digunakan oleh lazy coders sementara secara dinamis membuat query SQL.
Katakanlah Anda harus secara dinamis membuat kueri yang dimulai dengan
select * from t
dan memeriksa:beberapa orang akan menambahkan yang pertama dengan WHERE dan yang berikutnya dengan DAN dengan demikian:
Pemrogram malas (dan itu tidak selalu sifat buruk ) tidak akan membedakan antara kondisi yang ditambahkan, mereka akan mulai dengan
select * from t where 1=1
dan hanya menambahkan klausa DAN setelah itu.sumber
where 1=1
(Oracle) atauwhere true
(Postgres), saya harus memeriksa setiap kondisi apakah itu yang pertama. Tidak ada gunanya melakukannya, dan itu hanya menambah kode boilerplate.Saya menemukan berguna pola ini ketika saya sedang menguji atau menggandakan memeriksa hal-hal pada database, jadi saya dapat berkomentar dengan sangat cepat kondisi lain:
berubah menjadi:
sumber
di mana 1 = 0, ini dilakukan untuk memeriksa apakah tabel ada. Tidak tahu mengapa 1 = 1 digunakan.
sumber
Sementara saya bisa melihat bahwa 1 = 1 akan berguna untuk menghasilkan SQL, teknik yang saya gunakan dalam PHP adalah membuat array klausa dan kemudian melakukan
dengan demikian menghindari masalah memiliki AND yang memimpin atau tertinggal. Jelas ini hanya berguna jika Anda tahu bahwa Anda akan memiliki setidaknya satu klausa!
sumber
Berikut ini adalah contoh terkait: menggunakan
MERGE
pernyataan SQL untuk memperbarui target yang diajukan dengan menggunakan semua nilai dari tabel sumber di mana tidak ada atribut umum yang digunakan untuk bergabung misalnyasumber
Saya telah melihat kerangka kerja homespun melakukan hal-hal seperti ini ( blush ), karena ini memungkinkan praktik parsing malas diterapkan pada kata kunci
WHERE
danAND
Sql.Misalnya (saya menggunakan C # sebagai contoh di sini), pertimbangkan penguraian bersyarat dari predikat berikut dalam kueri Sql
string builder
:"Manfaat" dari
WHERE 1 = 1
berarti tidak diperlukan kode khusus:AND
diperlukan. Karena kita sudah memiliki setidaknya satu predikat dengan1 = 1
, itu berartiAND
selalu baik-baik saja.WHERE
harus dijatuhkan. Tapi sekali lagi, kita bisa malas, karena kita lagi dijamin paling tidak satu predikat.Ini jelas merupakan ide yang buruk dan akan merekomendasikan menggunakan kerangka kerja akses data atau ORM yang telah ditetapkan untuk mengurai predikat opsional dan bersyarat dengan cara ini.
sumber
WHERE 1=1
indikator yang adil bahwa BUKAN terjadi, bahwa basis kode dipenuhi dengan bit stringWHERE 1=1
, yang akan menunjukkan kepada saya masalah arsitektur aplikasi, dan saya kira bukan satu-satunya!Jika Anda datang ke sini untuk mencari
WHERE 1
, perhatikan ituWHERE 1
danWHERE 1=1
identik.WHERE 1
jarang digunakan karena beberapa sistem database menolaknya mengingatWHERE 1
tidak benar-benar menjadi boolean.sumber
Ini berguna dalam kasus di mana Anda harus menggunakan kueri dinamis di mana di mana klausa Anda harus menambahkan beberapa opsi filter. Seperti jika Anda memasukkan opsi 0 untuk status tidak aktif, 1 untuk aktif. Berdasarkan dari opsi, hanya ada dua opsi yang tersedia (0 dan 1) tetapi jika Anda ingin menampilkan Semua catatan, mudah untuk memasukkan di mana dekat 1 = 1. Lihat di bawah sampel:
sumber
Setelah meninjau semua jawaban, saya memutuskan untuk melakukan beberapa eksperimen seperti
Lalu saya periksa dengan nomor lain
dll. Setelah melakukan semua pemeriksaan, kueri menjalankan kota adalah sama. bahkan tanpa klausa mana. Saya bukan penggemar sintaks
sumber
Saya melakukan ini biasanya ketika saya sedang membangun SQL dinamis untuk laporan yang memiliki banyak nilai dropdown yang dapat dipilih pengguna. Karena pengguna mungkin atau mungkin tidak memilih nilai dari setiap dropdown, kami akhirnya mendapatkan kesulitan mencari tahu kondisi mana yang merupakan klausa pertama di mana. Jadi kami mengisi kueri dengan
where 1=1
pada akhirnya dan menambahkan semua klausa tempat setelah itu.Sesuatu seperti
Kemudian kita akan membangun mana klausa seperti ini dan memberikannya sebagai nilai parameter
Karena pemilihan klausa tidak diketahui oleh kami saat runtime, maka hal ini membantu kami dalam menemukan apakah akan menyertakan
'AND' or 'WHERE'.
sumber
Menggunakan predicate like
1=1
adalah petunjuk normal yang terkadang digunakan untuk memaksa rencana akses untuk menggunakan atau tidak menggunakan pemindaian indeks. Alasan mengapa ini digunakan adalah ketika Anda menggunakan kueri gabungan multi-bersarang dengan banyak predikat di klausa di mana kadang-kadang bahkan menggunakan semua indeks menyebabkan rencana akses untuk membaca setiap tabel - pemindaian tabel penuh. Ini hanyalah 1 dari banyak petunjuk yang digunakan oleh DBA untuk mengelabui dbms agar menggunakan jalur yang lebih efisien. Hanya saja, jangan melemparkan satu; Anda memerlukan dba untuk menganalisis kueri karena tidak selalu berfungsi.sumber
Berikut ini adalah use case ... namun saya tidak terlalu peduli dengan teknis mengapa saya harus menggunakan 1 = 1. Saya menulis fungsi, menggunakan pyodbc untuk mengambil beberapa data dari SQL Server. Saya mencari cara untuk memaksa pengisi setelah
where
kata kunci dalam kode saya. Ini memang saran yang bagus:Alasannya adalah karena saya tidak dapat mengimplementasikan kata kunci 'where' bersama-sama di dalam variabel klausa _where. Jadi, saya pikir menggunakan kondisi dummy yang mengevaluasi true akan dilakukan sebagai pengisi.
sumber
Saya pertama kali menemukan ini kembali dengan ADO dan asp klasik, jawaban yang saya dapatkan adalah: kinerja. jika Anda melakukan yang lurus
Select * from tablename
dan mengirimkannya sebagai perintah / teks sql Anda akan mendapatkan peningkatan kinerja yang nyata dengan
Where 1=1
menambahkan, itu perbedaan yang terlihat. ada hubungannya dengan header tabel yang dikembalikan segera setelah kondisi pertama terpenuhi, atau kegilaan lainnya, bagaimanapun, itu mempercepat segalanya.
sumber