Mengapa menggunakan WHERE 1 atau WHERE 1 = 1?

50

Biasanya, jika kondisi tidak diperlukan dalam pernyataan kueri kami, kami tidak menggunakan WHEREklausa. Tetapi saya telah melihat WHERE 1klausa yang digunakan di banyak tempat, bahkan di mana kondisi lain tidak ada.

  • Mengapa ini dilakukan?
  • Apakah ada manfaat khusus untuk waktu eksekusi?
  • Apakah ini memungkinkan fungsi lainnya?
  • Apakah menggunakan WHERE 1=1mirip dengan ini?
ursitesion
sumber

Jawaban:

45

Pada dasarnya ini hanya untuk kenyamanan programmer karena Anda hanya dapat menambahkan kondisi tambahan dengan AND...setelah itu dan tidak berdampak pada waktu eksekusi.

Lihat tautan ini ke Stackoverflow:

Catatan yang WHERE 1identik dengan WHERE 1=1; keduanya berarti WHERE TRUEtetapi yang pertama ditolak oleh banyak sistem manajemen basis data karena tidak benar-benar menjadi boolean.

Twinkles
sumber
16

Penggunaan utama saya adalah membuatnya lebih mudah untuk mengomentari hal-hal selama pengembangan kueri. Saya memimpin dengan ,'dan and':

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

Juga membuatnya lebih mudah untuk secara pemrograman menangani hal-hal sampai akhir.

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

Kalau tidak, Anda harus memenuhi syarat opsi pertama ... dan minta setiap opsi berikut memeriksa opsi sebelumnya. Bagaimana jika pengguna hanya memilih Opsi D pada contoh sebelumnya? Anda harus memastikan bahwa if A, B and C aren't chosenkemudian gunakan yang WHERElain gunakan and. Dengan =di awal, Anda bisa langsung menampar kualifikasi hingga akhir pernyataan.

WernerCD
sumber
1
Dan Anda menulis kode seperti 1980 dalam bahasa tanpa orientasi objek, sebelum ada yang datang dengan ide generator sql berbasis objek?
TomTom
Saya menulis codemirip dengan blok pertama di SSMS atau alat kueri serupa. Meneliti kumpulan data dan mendapatkan hasil yang tepat sebelum dimasukkan ke dalam alat pelaporan (seperti Crystal Reports) untuk pengguna akhir. Blok kedua adalah apa yang saya lihat dilakukan orang lain, karena pekerjaan saya belum terlalu banyak tentang akses sql mentah. Saya sudah memecahkan kode serupa orang lain dan bisa mengerti alasannya. (Kode berada di VB, C # dan PHP).
WernerCD
10

Kenapa kita melakukannya?

Pembuatan kode dinamis yang ditulis oleh programmer yang tidak terlalu kompeten muncul di benak saya.

Hasilkan SELECT .... DIMANA dan kemudian Anda harus memiliki SESUATU .... jadi alih-alih menambahkan WHERE hanya bila diperlukan, mereka menambahkan kondisi yang tidak terbatas ketika tidak ada. Terlihat itu - bertanggung jawab untuk memecat "spesialis".

Atau cowok itu hanya hal-hal DI MANA adalah wajib;)

Ada lagi yang gagal kulihat.

TomTom
sumber
5

Saya sedang memprogram banyak fungsi yang didefinisikan pengguna dalam C ++ / C untuk PostgreSQL yang digunakan oleh orang lain di perusahaan besar (10K + orang). Fungsi saya memiliki whereparameter opsional : jika tidak ada nilai yang diberikan, klausa itu tidak digunakan. Ini secara eksplisit didokumentasikan. Sayangnya, tidak ada yang menggunakan fitur ini dan semua orang yang hanya menyediakan where 1=1klausa. Secara teoritis ini tampaknya tidak bijaksana, hampir semua pengoptimal permintaan mengesampingkan jenis pernyataan ini. Dan sulit untuk mendidik 10 ribu orang.

arthur
sumber
3
Tidak ada yang pernah memanggil UDF Anda WHERE 1=1; DROP TABLE CUSTOMERS?
Twinkles
Namun, saya tidak dapat menemukan konsep di balik menggunakan klausa Where 1. Perlu lebih banyak klarifikasi? Karena saya tidak mendapatkan perbaikan dalam waktu eksekusi.
ursitesion
Ini tidak ada hubungannya dengan waktu eksekusi. Itu harus dilakukan dengan budaya bagaimana orang memprogram. Terkadang kode Anda (diprogram oleh orang-orang TI) digunakan oleh para insinyur. Orang-orang ini memiliki cara mereka sendiri untuk berpikir dan menjalankan kode Anda
arthur
@Twinkles: ini jelas merupakan masalah yang menarik. Ada beberapa poin poin di sini yang perlu diperhatikan. (i) basis data hanya dapat dibaca untuk UDF (ii) Fungsi saya bergabung dengan beberapa grup tabel dengan banyak hal dan untuk memperburuk keadaan menggunakan fungsi penyimpanan data pergudangan data. Ini membuatnya sulit untuk menjatuhkan apa pun, meskipun bukan tidak mungkin, (iii) UDF dimaksudkan untuk kode pra-produksi. Yang berarti bahwa itu tidak pernah masuk ke produksi: jika fungsi bertahan tantangan departemen lain sepenuhnya menulis ulang semua yang kami program
arthur
4
Sebenarnya cukup mudah untuk mendidik 10.000 orang. Buat aplikasi gagal ketika mereka melakukan kesalahan. Mereka akan segera berhenti melakukan kesalahan.
Jasmine
2

Menggunakan "where 1 = 1" mengurangi kompleksitas kode yang diperlukan dalam sql dinamis 'di mana' pembuatan klausa. Jika tidak, saat membuat klausa 'di mana' Anda perlu memeriksa apakah ini adalah komponen pertama untuk setiap komponen yang ditambahkan. Ini adalah pola kode sederhana untuk mengurangi kompleksitas kode dan mengurangi kompleksitas kode, jika memungkinkan, hampir selalu merupakan keputusan yang tepat.

Niall
sumber
0

Ini dia ... dari sudut pandang pemrograman, satu penggunaan 1 = 1 ...masukkan deskripsi gambar di sini

Dalam situasi seperti ini ketika saya perlu membuat kueri saat run time dan bisa pendek atau panjang, saya menggunakan 'where 1 = 1 AND'

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

Buat semuanya lebih mudah

Saurabh
sumber