Tại sao nên sử dụng WHERE 1 hoặc WHERE 1 = 1?


50

Thông thường, nếu các điều kiện không bắt buộc trong các câu lệnh truy vấn của chúng tôi, chúng tôi không sử dụng WHEREmệnh đề. Nhưng tôi đã thấy một WHERE 1điều khoản đang được sử dụng ở nhiều nơi, ngay cả khi không có điều kiện khác.

  • Tại sao điều này được thực hiện?
  • Có lợi ích cụ thể cho thời gian thực hiện?
  • Nó có cho phép các chức năng khác?
  • Là sử dụng WHERE 1=1tương tự như thế này?

Câu trả lời:


45

Về cơ bản nó chỉ để thuận tiện cho lập trình viên vì bạn chỉ có thể thêm các điều kiện bổ sung AND...sau đó và nó không ảnh hưởng đến thời gian thực hiện.

Kiểm tra các liên kết này đến Stackoverflow:

Lưu ý WHERE 1là giống hệt với WHERE 1=1; cả hai đều có nghĩa WHERE TRUEnhưng trước đây bị từ chối bởi nhiều hệ thống quản lý cơ sở dữ liệu vì không thực sự là boolean.


16

Công dụng chính của tôi là nó giúp bình luận dễ dàng hơn trong quá trình phát triển các truy vấn. Tôi dẫn đầu với ,'s và and' s:

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

Cũng làm cho nó dễ dàng hơn để lập trình công cụ cho đến cuối.

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 "

Nếu không, bạn phải đủ điều kiện tùy chọn đầu tiên ... và yêu cầu từng tùy chọn sau kiểm tra các tùy chọn trước đó. Nếu người dùng chỉ chọn Tùy chọn D trong ví dụ trước thì sao? Bạn phải chắc chắn rằng if A, B and C aren't chosensau đó sử dụng sử dụng WHEREkhác and. Khi =bắt đầu, bạn có thể tát các vòng loại đến cuối câu lệnh.


1
Và bạn đã viết mã như năm 1980 trong một ngôn ngữ không có định hướng đối tượng, liệu có ai nghĩ ra ý tưởng về trình tạo sql dựa trên đối tượng không?
TomTom

Tôi viết codetương tự như khối đầu tiên trong SSMS hoặc các công cụ truy vấn tương tự. Nghiên cứu các bộ dữ liệu và nhận được kết quả đúng trước khi đưa vào các công cụ báo cáo (như Báo cáo Pha lê) cho người dùng cuối. Khối thứ hai là những gì tôi đã thấy người khác làm, vì công việc của tôi không quá nhiều về truy cập sql thô. Tôi đã gây rắc rối cho những người khác mã tương tự và có thể hiểu lý do. (Mã được viết bằng VB, C # và PHP).
WernerCD

10

Tại sao chúng ta làm như vậy?

Tạo mã động được viết bởi các lập trình viên không quá thành thạo đến với tôi.

Tạo CHỌN .... Ở ĐÂU và sau đó bạn phải có SOMETHING .... vì vậy thay vì chỉ thêm WHERE khi cần, họ thêm một điều kiện không giới hạn khi không có. Nhìn thấy rằng - chịu trách nhiệm sa thải "chuyên gia".

Hoặc anh chàng chỉ là những thứ bắt buộc;)

Bất cứ điều gì khác tôi không nhìn thấy.


5

Tôi đã lập trình một loạt các hàm do người dùng định nghĩa trong C ++ / C cho PostgreSQL được sử dụng bởi những người khác trong một công ty lớn (10K + người). Các hàm của tôi có một wheretham số tùy chọn : nếu không có giá trị nào được đưa ra, mệnh đề không được sử dụng. Điều này đã được ghi lại rõ ràng. Thật không may, không ai sử dụng tính năng này và mọi người chỉ cung cấp where 1=1điều khoản. Về mặt lý thuyết điều này có vẻ không khôn ngoan, thực tế tất cả các trình tối ưu hóa truy vấn đều loại bỏ các loại câu lệnh này. Và thật khó để giáo dục người 10K.


3
Không ai từng gọi UDF của bạn với WHERE 1=1; DROP TABLE CUSTOMERS?
Twinkles 13/12/13

Tuy nhiên, tôi không thể tìm thấy các khái niệm đằng sau bằng cách sử dụng mệnh đề Where 1. Cần làm rõ hơn? Như tôi đã không nhận được bất kỳ cải thiện trong thời gian thực hiện.
ursitesion

Điều này có ít việc phải làm với thời gian thực hiện. Nó phải làm với văn hóa như thế nào mọi người lập trình. Đôi khi, mã của bạn (được lập trình bởi những người làm CNTT) được sử dụng bởi các kỹ sư. Những kẻ này có cách riêng để suy nghĩ và gọi mã của bạn
arthur 13/12/13

@Twinkles: đây chắc chắn là một vấn đề thú vị. Có một vài điểm ở đây cần lưu ý. (i) cơ sở dữ liệu chỉ đọc cho UDF (ii) Hàm của tôi tham gia một vài nhóm bảng bởi một loạt các thứ và để làm cho mọi thứ tồi tệ hơn khi sử dụng các hàm cửa sổ kho dữ liệu. Điều này khiến cho việc bỏ bất kỳ thứ gì trở nên khó khăn, mặc dù không phải là không thể, (iii) các UDF có nghĩa là cho mã tiền sản xuất. Có nghĩa là nó không bao giờ được đưa vào sản xuất: nếu chức năng sống sót thách thức bộ phận khác hoàn toàn viết lại tất cả những gì chúng ta được lập trình
arthur

4
Thật ra việc giáo dục 10.000 người khá dễ dàng. Làm cho ứng dụng thất bại khi họ làm sai. Họ sẽ ngay lập tức ngừng làm điều đó sai.
Jasmine

2

Sử dụng "where 1 = 1" làm giảm độ phức tạp của mã cần thiết trong việc tạo mệnh đề sql 'where' động. Mặt khác, khi tạo mệnh đề 'where', bạn sẽ cần kiểm tra xem đây có phải là thành phần đầu tiên cho mỗi thành phần được thêm vào không. Đây là một mẫu mã đơn giản để giảm độ phức tạp của mã và giảm độ phức tạp của mã, nếu có thể, gần như luôn luôn là quyết định đúng đắn.


0

Ở đây bạn đi ... từ quan điểm lập trình một lần sử dụng 1 = 1 ...nhập mô tả hình ảnh ở đây

Trong tình huống như thế này khi tôi cần xây dựng một truy vấn về thời gian chạy và nó có thể ngắn hoặc dài, tôi sử dụng 'trong đó 1 = 1 VÀ'

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);
        }

Làm cho mọi thứ dễ dàng hơn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.