LNNVL biện minh


12

LNNVL là một nhà tiên tri được xây dựng trong hàm trả về TRUE cho các điều kiện đánh giá thành FALSE hoặc UNKNOWN và trả về FALSE cho các điều kiện đánh giá thành TRUE. Câu hỏi của tôi là điều gì sẽ là lợi ích của việc trả lại điều ngược lại với điều kiện sự thật thay vì chỉ xử lý các giá trị NULL?

Ví dụ: giả sử bạn có một bảng Emp với các cột StartCommission và CurrentCommission có thể chứa null. Các giá trị sau chỉ trả về các hàng không có giá trị null:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission;

Nếu bạn muốn bao gồm các hàng trong đó hoa hồng là null, bạn có thể làm một cái gì đó như thế này:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission 
OR StartCommission IS NULL OR CurrentCommission IS NULL;

Có vẻ như một hàm sẽ tồn tại để rút ngắn cú pháp này, nhưng sử dụng LNNVL sẽ trả về tất cả các bản ghi không bằng nhau và tất cả các bản ghi có giá trị null.

SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);

Thêm KHÔNG vào điều này chỉ trả về các hàng không có giá trị null. Dường như với tôi rằng chức năng mong muốn trong trường hợp này sẽ là giữ cho điều kiện đúng là đúng, điều kiện sai là sai và có các điều kiện chưa biết đánh giá là đúng. Tôi đã thực sự tạo ra một trường hợp sử dụng thấp ở đây? Có thực sự nhiều khả năng muốn biến những điều chưa biết thành đúng, đúng thành sai và sai thành đúng?

create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2));
insert into emp values (null,null);
insert into emp values (null,.1);
insert into emp values (.2,null);
insert into emp values (.3,.4);

Hôm nay tôi đã gặp LNNVL và tôi đang cố gắng tìm hiểu hoặc hiểu phần này cũng như "điều gì sẽ là lợi ích của việc trả lại điều ngược lại với sự thật". Tuy nhiên, câu lệnh bạn sử dụng để minh họa LNNVL nên sử dụng toán tử không bằng nhau: CHỌN * TỪ Emp WHERE LNNVL (StartCommission <> CurrentCommission); để nó trả về kết quả giống như câu lệnh sử dụng OR. Nói cách khác, nếu chúng ta đang sử dụng một điều kiện và chúng ta cũng muốn bao gồm các hàng có giá trị NULL, chúng ta cần chuyển phủ định điều kiện của chúng ta sang LNNVL.
Chỉ có bạn

Một ví dụ đơn giản khác. Chỉ những nhân viên thực sự nhận được hoa hồng dưới 20%: CHỌN * TỪ nhân viên WHERE hoa hồng_pct <.2; Để bao gồm cả những nhân viên không nhận được hoa hồng nào cả: CHỌN * TỪ nhân viên WHERE LNNVL (hoa hồng_pct> = .2);
Chỉ có bạn

@OnlyYou - Bạn đã đúng, rằng để làm cho LNNVL hoạt động giống như điều kiện sẽ phải là <>. Tôi đã để lại nó = nhiều hơn bởi vì nếu hàm đã trả về cùng kết quả với dấu = thì nó sẽ có ý nghĩa hơn. Về cơ bản, chức năng này đang thực hiện hai hành động 1. Bao gồm không, 2. Chuyển đổi Boolean. Cái trước có ý nghĩa, cái sau dường như chỉ gây nhầm lẫn những thứ đòi hỏi ngược lại với điều kiện mong muốn. tức là = yêu cầu <>, <yêu cầu> =, v.v.
Leigh Riffel

Câu trả lời:


6

Đó là một chức năng kỳ lạ với một lịch sử kỳ lạ - nhưng sau đó nvl2 cũng kỳ lạ. lnnvlvề cơ bản là một is not truetoán tử - không nghi ngờ gì nó có thể được sử dụng tốt như nvl2có thể, nhưng khi bạn phải tìm kiếm một chức năng mỗi khi bạn sử dụng nó để nhắc nhở bạn chính xác những gì nó làm, bạn sẽ tự hỏi liệu có tốt nhất để bám vào không nvl, coalesce, decodenullifcùng với casebiểu thức, mà là trực quan hơn


Tôi không thấy NVL2 lạ, nhưng sau đó tôi sử dụng nó rất nhiều và tôi chưa bao giờ sử dụng LNNVL.
Leigh Riffel

@Leigh - Tôi đoán bạn phải sử dụng nó thường xuyên đủ để nó trở nên không lạ :) Tôi chưa bao giờ sử dụng nullifcho đến khi tôi nhận ra nó có thể giúp ích rất nhiều cho việc 'chia cho số 0' = null. Bạn có thực sự tìm thấy nvl2 (a, c, b) tốt hơn nhiều so với giải mã (a, null, b, c) không?
Jack nói hãy thử topanswers.xyz

4

Nói theo cách này, tôi chưa một lần sử dụng LNNVL trong vài năm làm Lập trình viên DBA và PL / SQL. Tôi đã sử dụng NVL2 trong một dịp nào đó (và luôn phải tìm bên nào đúng và bên nào không). Vào thời điểm đó, có vẻ tốt hơn từ góc độ dễ đọc để kết thúc bằng cách sử dụng NVL, DECODE, CASE, v.v.,

Ngoài ra, điều này hoạt động, giả sử một người có khả năng xử lý tốt cách Oracle xử lý NULL và số học, nhưng đến thời điểm này, người ta cũng có thể sử dụng truy vấn ban đầu của bạn để dễ đọc (và kế hoạch thực hiện cũng có thể gặp khó khăn hơn):

/* Return all rows where StartCommission is the same
 * as Current Commission, or those rows who have a
 * NULL in either (including both)
 */

SELECT *
  FROM Emp
 WHERE StartCommission = CurrentCommission
    OR StartCommission + CurrentCommission IS NULL

-- NULL + NULL, or NULL + Number is always NULL; hence return either
-- those records that are equal, or have a combined total of NULL
-- (either or both fields will be NULL).

Ý bạn là StartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULLsao
Jack nói hãy thử topanswers.xyz

@JackPDoureb - Nó có ý nghĩa như =.
Leigh Riffel

Biến thể thú vị. Tôi đồng ý với kết luận của bạn.
Leigh Riffel

@Leigh - Tôi thấy, một sự thay thế cho chức năng bạn muốn, không phải là một sự thay thế cho lnnvl.
Jack nói hãy thử topanswers.xyz

@JackPDoureb - Tôi hiểu và tôi nghĩ đó là những gì Kerri dự định.
Leigh Riffel
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.