ทำไมต้องใช้ WHERE 1 หรือ WHERE 1 = 1


50

โดยปกติหากไม่ต้องการเงื่อนไขในข้อความค้นหาของเราเราจะไม่ใช้WHEREประโยค แต่ฉันเห็นWHERE 1ประโยคที่ใช้ในหลาย ๆ ที่แม้ไม่มีเงื่อนไขอื่น ๆ

  • ทำไมถึงทำเช่นนี้?
  • มีประโยชน์เฉพาะเวลาดำเนินการหรือไม่
  • มันทำให้ฟังก์ชั่นอื่น ๆ ?
  • การใช้WHERE 1=1คล้ายกับสิ่งนี้หรือไม่

คำตอบ:


42

โดยทั่วไปเป็นเพียงเพื่อความสะดวกของโปรแกรมเมอร์เนื่องจากคุณสามารถเพิ่มเงื่อนไขเพิ่มเติมAND...หลังจากนั้นและจะไม่มีผลกระทบกับเวลาดำเนินการ

ลองดูลิงค์เหล่านี้เพื่อ Stackoverflow:

โปรดทราบว่าWHERE 1เหมือนกันกับWHERE 1=1; ทั้งค่าเฉลี่ยWHERE TRUEแต่ค่าเริ่มต้นถูกปฏิเสธโดยระบบการจัดการฐานข้อมูลจำนวนมากเนื่องจากไม่ใช่บูลีน


15

การใช้งานหลักของฉันคือทำให้ง่ายขึ้นที่จะแสดงความคิดเห็นสิ่งต่าง ๆ ในระหว่างการพัฒนาของแบบสอบถาม ฉันเป็นผู้นำด้วย,'s และand' s:

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

นอกจากนี้ยังช่วยให้ง่ายขึ้นในการเปลี่ยนสิ่งต่าง ๆ โดยทางโปรแกรมไว้จนจบ

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 "

มิฉะนั้นคุณจะต้องผ่านคุณสมบัติตัวเลือกแรก ... และให้แต่ละตัวเลือกต่อไปนี้ตรวจสอบตัวเลือกก่อนหน้า เกิดอะไรขึ้นถ้าผู้ใช้เลือกตัวเลือก D ในตัวอย่างก่อนหน้านี้? คุณต้องตรวจสอบให้แน่ใจว่าif A, B and C aren't chosenใช้WHEREอย่างอื่นandแล้ว เมื่อ=เริ่มต้นคุณสามารถตบตัวระบุไปยังท้ายคำสั่งได้


1
และคุณเขียนโค้ดเช่น 1980 ในภาษาที่ไม่มีการวางแนววัตถุก่อนใครมากับแนวคิดของตัวสร้าง sql แบบออบเจ็กต์?
TomTom

ฉันเขียนcodeคล้ายกับบล็อกแรกใน SSMS หรือเครื่องมือสืบค้นที่คล้ายกัน การวิจัยชุดข้อมูลและรับผลลัพธ์ที่ถูกต้องก่อนที่จะใส่ลงในเครื่องมือการรายงาน (เช่น Crystal Reports) สำหรับผู้ใช้ปลายทาง บล็อกที่สองคือสิ่งที่ฉันเห็นคนอื่นทำเพราะงานของฉันไม่ได้มากเกินไปเกี่ยวกับการเข้าถึง sql ดิบ ฉันแก้ไขปัญหารหัสที่คล้ายกันของผู้อื่นและสามารถเข้าใจเหตุผล (รหัสคือ VB, C # และ PHP)
WernerCD

10

ทำไมเราทำเช่นนั้น?

การสร้างรหัสแบบไดนามิกที่เขียนโดยโปรแกรมเมอร์ที่มีความสามารถไม่ได้เข้ามาในความคิดของฉัน

สร้าง SELECT .... เมื่อไรและจากนั้นคุณต้องมีบางสิ่งบางอย่าง .... ดังนั้นแทนที่จะเพิ่ม WHERE เมื่อจำเป็นเท่านั้นพวกเขาจะเพิ่มเงื่อนไขที่ไม่ จำกัด เมื่อไม่มีใครอยู่ที่นั่น เห็นว่า - รับผิดชอบในการยิง "ผู้เชี่ยวชาญ"

หรือคนที่แต่งตัวประหลาดเพียงสิ่งที่บังคับ;)

มีอะไรอีกบ้างที่ฉันมองไม่เห็น


5

ฉันกำลังเขียนโปรแกรมฟังก์ชั่นที่ผู้ใช้กำหนดใน C ++ / C สำหรับ PostgreSQL ที่คนอื่นใช้ใน บริษัท ขนาดใหญ่ (10K + คน) ฟังก์ชั่นของฉันมีwhereพารามิเตอร์ที่เป็นทางเลือก: หากไม่ได้รับค่าจะไม่ใช้คำสั่งย่อย นี่เป็นเอกสารอย่างชัดเจน น่าเสียดายที่ไม่มีใครใช้คุณสมบัตินี้และทุกคนที่เพิ่งส่งwhere 1=1ข้อ ตามทฤษฎีแล้วดูเหมือนว่าจะไม่ฉลาดนักโดยทั่วไปเครื่องมือเพิ่มประสิทธิภาพการสืบค้นทั้งหมดจะออกกฎคำสั่งประเภทนี้ออกมา และเป็นเรื่องยากที่จะให้การศึกษาแก่ผู้คน 10K


3
ไม่มีใครเคยเรียก UDF ของคุณด้วยWHERE 1=1; DROP TABLE CUSTOMERSเหรอ?
Twinkle

ถึงกระนั้นฉันยังไม่สามารถค้นหาแนวคิดเบื้องหลังการใช้ Where 1 clause ได้ ต้องการคำชี้แจงเพิ่มเติมหรือไม่ เนื่องจากฉันไม่ได้รับการปรับปรุงใด ๆ ในเวลาดำเนินการ
ursitesion

สิ่งนี้มีสิ่งที่ต้องทำเล็กน้อยกับเวลาดำเนินการ มีสิ่งที่ต้องทำกับวัฒนธรรมที่ผู้คนตั้งโปรแกรมไว้ มันเกิดขึ้นบางครั้งรหัสของคุณ (โปรแกรมโดยคน IT) ถูกใช้โดยวิศวกร พวกเหล่านี้มีวิธีการของตัวเองที่จะคิดและเรียกรหัสของคุณ
อาร์เธอร์

@ ริ้วรอย: นี่เป็นปัญหาที่น่าสนใจอย่างแน่นอน มีจุดไม่กี่จุดที่นี่เพื่อทราบ (i) ฐานข้อมูลเป็นแบบอ่านอย่างเดียวสำหรับ UDF (ii) ฟังก์ชั่นของฉันเข้าร่วมกลุ่มตารางสองสามกลุ่มโดยสิ่งต่าง ๆ และเพื่อทำให้สิ่งต่าง ๆ แย่ลงใช้ data windowing ฟังก์ชั่นการทำคลังข้อมูล สิ่งนี้ทำให้มันยากที่จะวางสิ่งใด ๆ แม้ว่าจะเป็นไปไม่ได้ (iii) UDF นั้นมีไว้สำหรับโค้ดก่อนการผลิต ซึ่งหมายความว่ามันไม่เคยได้รับในการผลิต: ถ้าฟังก์ชันรอดท้าทายแผนกอื่นสมบูรณ์ปรับเปลี่ยนทุกอย่างที่เราตั้งโปรแกรม
อาร์เธอร์

4
จริงๆแล้วมันง่ายที่จะให้ความรู้กับคน 10,000 คน ทำให้แอปพลิเคชันล้มเหลวเมื่อพวกเขาทำผิด พวกเขาจะหยุดทำผิดทันที
จัสมิน

2

การใช้ "where 1 = 1" จะช่วยลดความซับซ้อนของรหัสที่ต้องการใน dynamic sql 'โดยที่' การสร้าง clause มิฉะนั้นเมื่อสร้างประโยค 'where' คุณจะต้องตรวจสอบว่านี่เป็นองค์ประกอบแรกสำหรับแต่ละองค์ประกอบที่เพิ่มเข้ามาหรือไม่ นี่เป็นรูปแบบรหัสแบบง่าย ๆ เพื่อลดความซับซ้อนของรหัสและลดความซับซ้อนของรหัสหากเป็นไปได้การตัดสินใจที่ถูกต้องเกือบทุกครั้ง


0

ที่นี่คุณไป ... จากมุมมองการเขียนโปรแกรมหนึ่งครั้งใช้ 1 = 1 ...ป้อนคำอธิบายรูปภาพที่นี่

ในสถานการณ์เช่นนี้เมื่อฉันต้องการสร้างแบบสอบถามในเวลาทำงานและสามารถสั้นหรือยาวได้ฉันใช้ '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);
        }

ทำให้สิ่งต่าง ๆ ง่ายขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.