PDA

View Full Version : hàm if trong câu lệnh select



Nobboo
15-08-2007, 14:43
chào các bạn.
hiện mình đang có 1 yêu cầu mà chưa biết phải làm sao.
có cách nào xuất giá trị trong câu select ra theo điều kiện:
giá trị > 0 ===> giá trị, nếu không thì xuất ra 0.
bên MS SQL thì mình dùng iif để làm, còn oracle có lệnh nào tương đương không vậy các bạn,
thanks

MichaelTuanAnh
15-08-2007, 15:13
bên oracle dùng DECODE, bạn lên google gõ DECODE Oracle xem kết quả nhé

Nobboo
15-08-2007, 15:15
bên oracle dùng DECODE, bạn lên google gõ DECODE Oracle xem kết quả nhé
mình thử dùng DECODE rồi, nhưng DECODE chỉ cho ra kết quả với chuỗi thôi, không dùng so sánh được, thanks

Nobboo
15-08-2007, 15:20
hiện tại đã giải quyết được = cách kết hợp DECODE với SIGN, nhưng còn cách nào khác k vậy các bạn?

lotomo
19-08-2007, 15:07
Còn 1 cách khác tớ hay dùng là viết 1 thủ tục select ... into X ...
If x > 0 then
....
Else
....

Nobboo
20-08-2007, 07:54
Còn 1 cách khác tớ hay dùng là viết 1 thủ tục select ... into X ...
If x > 0 then
....
Else
....
chưa rõ lắm, viết PL ah,
ai giải thích dùm mình cái :emlaugh::emlaugh:

minhpn
21-08-2007, 11:00
Câu lệnh như sau:
select decode (A+ABS(A),0,0, A) from dual

Tia
23-08-2007, 14:39
chào các bạn.
hiện mình đang có 1 yêu cầu mà chưa biết phải làm sao.
có cách nào xuất giá trị trong câu select ra theo điều kiện:
giá trị > 0 ===> giá trị, nếu không thì xuất ra 0.
bên MS SQL thì mình dùng iif để làm, còn oracle có lệnh nào tương đương không vậy các bạn,
thanks

Dùng Case ... When đi, mẫu lệnh như sau:

CASE { WHEN boolean_expression THEN {statement;} ... }...
[ ELSE {statement;}... ]
END CASE [ label_name ];

Ví dụ

CASE
WHEN salary >= 10000 AND salary <=20000 THEN
give_bonus(employee_id, 1500);
WHEN salary > 20000 AND salary <= 40000 THEN
give_bonus(employee_id, 1000);
WHEN salary > 40000 THEN
give_bonus(employee_id, 500);
ELSE
give_bonus(employee_id, 0);
END CASE;

minhquan1712
23-08-2007, 14:53
http://infolab.stanford.edu/~ullman/fcdb/oracle/or-plsql.html
bạn dùng cái này coi, hình như ỏacle cũng có if mà. D(úng ko nhỉ??

Nobboo
23-08-2007, 16:27
http://infolab.stanford.edu/~ullman/fcdb/oracle/or-plsql.html
bạn dùng cái này coi, hình như ỏacle cũng có if mà. D(úng ko nhỉ??

thanks, mình hỏi về câu lệnh select chứ mình k muốn dùng PL

tt2006
24-08-2007, 21:49
Theo yêu cầu như của bạn thì viết như sau:


SELECT CASE WHEN giatri > 0 THEN giatri ELSE 0 END
FROM DUAL;

Ví dụ để kiểm chứng đây: Tôi sẽ lấy năm hiện tại của hệ thống. Nếu năm > 0 thì trả về năm, ngược lại thì trả về 0.


SELECT CASE WHEN to_number(to_char(SYSDATE, 'YYYY')) > 0 /* Lay nam hien tai: tuc la gia tri ma ban neu */
THEN
to_number(to_char(SYSDATE, 'YYYY')) /* tra ve nam hien tai */
ELSE
0 /* Tra ve gia tri 0 */
END as bieuthuc
FROM DUAL;

Test phần sau biểu thức ELSE: Lấy năm hiện tại trừ cho chính nó.


SELECT CASE WHEN to_number(to_char(SYSDATE, 'YYYY')) - to_number(to_char(SYSDATE, 'YYYY')) > 0
THEN
to_number(to_char(SYSDATE, 'YYYY'))
ELSE
0
END as bieuthuc
FROM DUAL;

Cú pháp cụ thể của lệnh CASE thì bạn Tia đã trình bày ở phía trên rồi.

Vài dòng trao đổi cùng bạn. Mong các bạn trên diễn đàn góp ý thêm.

Thân chào.

ViTieuBao2003
24-08-2007, 23:58
Nếu bạn muốn dùng câu lệnh SQL kô thì dùng hàm DECODE



SELECT colA, colB, colC , DECODE (colD, '>0', colD, 0)
FROM tblX



Dòng lệnh này ăn tiền chỗ DECODE

Ý nghĩa dòng lệnh DECODE
IF colD > 0 Then
return colD
ELSE
return 0
END IF

tt2006
25-08-2007, 20:59
Nếu bạn muốn dùng câu lệnh SQL kô thì dùng hàm DECODE



SELECT colA, colB, colC , DECODE (colD, '>0', colD, 0)
FROM tblX



Dòng lệnh này ăn tiền chỗ DECODE

Ý nghĩa dòng lệnh DECODE
IF colD > 0 Then
return colD
ELSE
return 0
END IF



Tôi đã test cách làm của bạn nhưng thấy không ổn. Ứng dụng câu lệnh của bạn tôi viết câu lệnh này:

select employee_id, first_name, salary, decode(salary, '>0', salary, 0)
from employees
where employee_id=206;
Thì được kết quả như sau:

EMPLOYEE_ID FIRST_NAME SALARY DECODE(SALARY,'>0',SALARY,0)
----------- -------------------- ---------- ----------------------------
206 William 8300 0

Rõ ràng là salary = 8300 >0. Nhưng DECODE lại trả về giá trị là 0. Đâu có giống như những gì bạn mô tả đâu. Vậy là câu lệnh của bạn không có ăn tiền rồi há. Hehehe...

Tôi có nhầm chổ nào không bạn?

Thân chào.

ViTieuBao2003
26-08-2007, 00:43
YES, câu lệnh trên sai rồi.hìhì. Lâu lâu, cũng muốn check xem có ai "PRO" về Oracle kô? Mời các bạn wa 2 topic mình hỏi để reply cho mình mấy câu hỏi đơn giản.
1 - RUN REPORT từ FORM
2 - Bảng hệ thống lưu trữ pasword!




SELECT employee_id, salary,
CASE
when salary>0 then 4
else 5
END TEST
FROM Employees
WHERE employee_id =206;
/


SELECT employee_id, salary, DECODE(SIGN(salary),1,4,5) TEST
FROM Employees
WHERE employee_id =206;
/
Ý nghĩa
IF salary >0 THEN
RETURN 4
ELSE
RETURN 5
END IF

SELECT employee_id, salary, DECODE(SIGN(salary),-1,4,5) TEST
FROM Employees
WHERE employee_id =206;
/
Ý nghĩa
IF salary< 0 THEN
RETURN 4
ELSE
RETURN 5
END IF

tt2006
26-08-2007, 10:24
Tiếp luôn cho trường hợp salary = 0.

SELECT employee_id, salary, DECODE(SIGN(salary), 0, 4, 5) TEST
FROM Employees
WHERE employee_id =206;
Ý nghĩa:

IF salary = 0 THEN
RETURN 4
ELSE
RETURN 5
END IF;

Nobboo
27-08-2007, 16:03
mới đọc tính hô lên sai ai dè tt2006 hô trước rồi, thanks ae nhiệt tình.
Mình làm được là nhờ kết hợp với SIGN
câu hỏi tiếp là còn cách nào khác ngoài, if, case, SIGN không :-D
chắc hết rồi.
Bực các DECODE này ghê

MYTHEBT
01-10-2008, 17:59
Có ai biết dùng hàm IF trong SQL Server ko giúp dùm với
Cho biết giới tính Nam, nữ
Ai biết xin gửi về: my_the09@yahoo.com