NEREDE veya NEREDE 1 = 1 kullanılıyor?


50

Genellikle, sorgu ifadelerimizde şartlar gerekli değilse, bir WHEREcümle kullanmayız . Ancak WHERE 1, başka koşulların mevcut olmadığı durumlarda bile, birçok yerde kullanılmakta olan bir fıkra görüyorum .

  • Bu neden yapılır?
  • Yürütme zamanının belirli yararları var mı?
  • Diğer işlevleri mümkün kılıyor mu?
  • Kullanmak WHERE 1=1buna benzer mi?

Yanıtlar:



15

Asıl kullanımım, sorguların geliştirilmesi sırasında bazı şeyleri yorumlamayı kolaylaştırmasıdır. Ben ,s and' ile kurşun :

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

Ayrıca programatik olarak konuların sonuna kadar tutturulmasını kolaylaştırır.

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 "

Aksi halde, ilk seçeneği onaylamanız gerekir ... ve aşağıdaki seçeneklerin her birinin önceki seçenekleri kontrol etmesini istemeniz gerekir. Kullanıcı önceki örnekte yalnızca Seçenek D'yi seçerse? Başka bir kullanım if A, B and C aren't chosenkullandığından emin olmalısın . İle başında, sadece ifadenin sonuna eleme tokatlayabilirsin.WHEREand=


1
Nesne yönelimli olmayan bir dilde, 1980 gibi bir kod yazıp, nesne temelli sql üreteci fikri olan herkes için?
TomTom

codeSSMS'deki ilk bloğa veya benzer sorgu araçlarına benzer yazıyorum . Veri kümelerini araştırmak ve son kullanıcılar için raporlama araçlarına (Crystal Reports gibi) koyulmadan önce doğru sonuçları almak. İkinci blok, başkalarının ne yaptığını gördüm, çünkü işim ham sql erişimiyle ilgili çok fazla değildi. Başkalarının da benzer kodlarını sıkıntıya soktum ve nedenini anlayabiliyorum. (Kod VB, C # ve PHP idi).
WernerCD

10

Neden böyle yapıyoruz?

Yetkili olmayan programcılar tarafından yazılmış dinamik kod oluşturma aklıma geliyor.

SELECT'i üretir .... NEREDE ve sonra SOMETHING'e sahip olmalısınız .... böylece NEREYE yalnızca gerektiğinde eklemek yerine, hiçbiri olmadığında sınırlayıcı olmayan bir koşul eklerler. Bunu gördüm - "uzman" i kovmaktan sorumlu.

Ya da adam sadece NEREDE zorunlu olan şeyler;)

Göremediğim başka bir şey var.


5

Diğer firmaların büyük bir şirkette (10K + kişi) kullandığı PostgreSQL için C ++ / C dilinde bir dizi kullanıcı tanımlı işlevler programlıyordum. İşlevlerimin isteğe bağlı bir whereparametresi var: eğer bir değer belirtilmemişse, bu madde kullanılmadı. Bu açıkça belgelenmiştir. Ne yazık ki, hiç kimse bu özelliği kullanmıyor ve herkesi sadece tedarik where 1=1maddesinin bulunduğu yerlerde kullanıyor . Teorik olarak, bu mantıklı görünmüyor, pratik olarak tüm sorgu iyileştiricileri bu tür ifadeleri dışlıyor. Ve 10 bin kişiyi eğitmek zor.


3
Hiç kimse UDF'nizi arayamadı WHERE 1=1; DROP TABLE CUSTOMERSmı?
Pırıltılar

Yine de Where 1 yan tümcesini kullanarak arkasındaki kavramları bulamıyorum. Daha fazla açıklamaya mı ihtiyacınız var? Yürütme süresinde herhangi bir gelişme olmadığından.
ursitesion,

Bunun yürütme zamanı ile ilgisi yok. İnsanların programladığı kültürle ilgisi var. Bazen kodunuz (IT çalışanları tarafından programlanan) mühendisler tarafından kullanılır. Bu adamlar kodunuzu düşünmek ve çağırmak için kendi yollarına sahipler
arthur

@Twinkles: Bu kesinlikle ilginç bir konudur. Burada dikkat edilmesi gereken birkaç nokta var. (i) veritabanı UDF için salt okunurdur (ii) İşlevim birkaç tablo grubuna bir çok şeyle katılır ve işleri daha da kötüleştirmek için veri depolama pencereleri işlevini kullanır. Bu, imkansız olmasa da, bir şeyi düşürmeyi zorlaştırır, (iii) UDF'lerin üretim öncesi kod için kullanılması amaçlanmıştır. Bu, asla üretime girmediği anlamına gelir: eğer işlev zorluklardan kurtulursa, başka bir departman programladığımız her şeyi tamamen yeniden yazar
arthur

4
Aslında 10.000 kişiyi eğitmek oldukça kolay. Yanlış yaptıklarında uygulamanın başarısız olmasını sağlayın. Hemen yanlış yapmaktan vazgeçecekler.
Jasmine,

2

"Where 1 = 1" kullanmak, dinamik sql 'where' cümle oluşturma işleminde gereken kodun karmaşıklığını azaltır. Aksi takdirde, 'where' yan tümcesini oluştururken, bunun eklenen her bileşen için ilk bileşen olup olmadığını kontrol etmeniz gerekir. Bu, kod karmaşıklığını azaltmak ve mümkün olduğunda kod karmaşıklığını azaltmak için mümkün olan her zaman doğru karardır.


0

İşte başlıyorsunuz ... programlama açısından 1 = 1 bir kullanım ...görüntü tanımını buraya girin

Böyle bir durumda çalışma zamanında bir sorgu oluşturmam gerektiğinde ve kısa veya uzun olabilir, '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);
        }

İşleri kolaylaştırın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.