2016-02-26 28 views
5

Tôi đang cố gắng đánh giá nhiều cột để tự lưu lại một vài lần nhấn phím (được cấp, tại thời điểm này, thời gian và nỗ lực tìm kiếm đã từ lâu phủ nhận bất kỳ "lợi ích" nào mà tôi từng nhận được) thay vì nhiều so sánh khác nhau.PL SQL - Nhiều cột bình đẳng

Về cơ bản, tôi có:

WHERE column1 = column2 
AND column2 = column3 

tôi muốn:

WHERE column1 = column2 = column3 

tôi tìm thấy bài viết này khác, đó là tiếp tuyến liên quan: Oracle SQL Syntax - Check multiple columns for IS NOT NULL

+2

Một số cơ sở dữ liệu hỗ trợ cú pháp đó nhưng nó rất phi tiêu chuẩn. Phiên bản 'OR' là con đường để đi. –

+1

@GordonLinoff, bạn không có ý nghĩa 'AND'? – goodguy5

Trả lời

5

Sử dụng:

x=all(y,z) 

thay vì

x=y and y=z 

Trên đây tiết kiệm 1 tổ hợp phím (1/11 = 9% - không nhiều).

Nếu tên cột là lâu hơn, sau đó nó mang lại cho tiết kiệm lớn hơn:

Đây là 35 ký tự dài:

column1=column2 AND column2=column3 

trong khi cái này chỉ 28

column1=ALL(column2,column3) 

Nhưng đối với cái này (95 ký tự):

column1=column2 AND column2=column3 AND column3=column4 
AND column4=column5 AND column5=column6 

bạn sẽ nhận được 43/95 = gần 50% tiết kiệm

column1=all(column2,column3,column4,column5,column6) 

ALL điều hành là một phần của ANSII SQL, nó được hỗ trợ bởi hầu hết các cơ sở dữ liệu (MySQL, PostgreSQL, SQLServer, vv
http://www.w3resource.com/sql/special-operators/sql_all.php


Một trường hợp thử nghiệm đơn giản cho thấy cách hoạt động:

create table t(x int, y int, z int); 

insert all 
into t values(1,1,1) 
into t values(1,2,2) 
into t values(1,1,2) 
into t values(1,2,1) 
select 1 from dual; 

select * 
from t 
where x = all(y,z); 

     X   Y   Z 
---------- ---------- ---------- 
     1   1   1 
+0

Tôi rất vui khi thử điều này vào ngày mai tại nơi làm việc. Tôi sẽ đánh dấu câu trả lời này đúng nếu nó hoạt động. – goodguy5

+0

Nó hoạt động rất tốt! Cảm ơn bạn rất nhiều. Tôi rất vui mừng để hiển thị điều này cho tất cả các "bạn bè" SQL của tôi. Tôi có một câu hỏi về nó, mặc dù: nó có bất kỳ loại tác động hiệu suất đáng chú ý? truy vấn của tôi ** ĐÃ HẾT ** chậm hơn, nhưng tôi đã không thực hiện bất kỳ kiểm tra đáng tin cậy nào đối với các tập dữ liệu. (không cần phải phân tích nó, nếu bạn không biết, bạn đã làm đủ rồi;)) – goodguy5

2

Một mẹo nhỏ có thể là sử dụng các hàm leastgreatest - nếu lớn nhất và giá trị nhỏ nhất của một danh sách các giá trị này được bình đẳng, nó phải có nghĩa là tất cả các giá trị đều bình đẳng:

LEAST(col1, col2, col3) = GREATEST(col1, col2, col3) 

Tôi không chắc nó tiết kiệm bất kỳ tổ hợp phím trên một danh sách ba cột, nhưng nếu bạn có nhiều cột , nó có thể tiết kiệm một số nhân vật. Lưu ý rằng giải pháp này ngầm giả định rằng không có giá trị nào là null, nhưng giải pháp gốc của bạn cũng vậy, vì vậy nó sẽ ổn.

+1

Điều đó có hoạt động với một mục không phải là số không? Giống như tên/địa chỉ/những gì bạn có? Nhưng nếu không, cảm ơn ý tưởng! – goodguy5

+1

@ goodguy5 yup, 'ít nhất' và' lớn nhất' nên hoạt động với bất kỳ loại đặt hàng nào (chẳng hạn như loại ký tự, ngày, v.v.) – Mureinik

+0

@Mureinik 'col1 = col2 VÀ col2 = col3' có 27 ký tự, trong khi' LEAST (col1, col2, col3) = GREATEST (col1, col2, col3) 'có 52 charactes, vì vậy tôi nghi ngờ nếu điều này tiết kiệm bất kỳ phím tắt nào – krokodilko