2012-04-18 24 views
7

Tôi có bảng sau:Nếu trường là null, hãy kéo một số trường nhất định; cách khác, kéo các lĩnh vực khác

TestTable 
    ColumnA 
    Column1 
    Column2 
    Column3 
    Column4 

Tôi muốn viết một câu lệnh SQL đơn giản để kiểm tra columnA và tùy thuộc vào việc nó là null hay không trả về cột nhất định.

Giống như (giả):

If ColumnA Is Null 
    SELECT ColumnA, Column1, Column2 
    FROM TestTable 
Else 
    SELECT ColumnA, Column3, Column4 
    FROM TestTable 

Bất kỳ ý tưởng?

+0

Bạn đang sử dụng cơ sở dữ liệu nào? Bạn có cả hai thẻ Oracle và SQL Server. –

Trả lời

3

tôi có thể nghĩ đến một vài tuyến đường, không nhất thiết phải đẹp ...

Mọi người thường tìm cái đầu tiên, sau đó tìm cái gì đó tốt hơn. Tôi không chắc là có gì tốt hơn không.

SELECT 
    ColumnA, 
    CASE WHEN ColumnA IS NULL THEN Column1 ELSE Column2 END AS ColumnB, 
    CASE WHEN ColumnA IS NULL THEN Column3 ELSE Column4 END AS ColumnC 
FROM 
    yourTable 

Hoặc ...

SELECT 
    yourTable.ColumnA, 
    subTable.ColumnB, 
    subTable.ColumnC 
FROM 
    yourTable 
CROSS APPLY 
(
    SELECT yourTable.Column1 AS ColumnB, yourTable.Column3 AS ColumnC WHERE yourTable.ColumnA IS NULL 
    UNION ALL 
    SELECT yourTable.Column2 AS ColumnB, yourTable.Column4 AS ColumnC WHERE yourTable.ColumnA IS NOT NULL 
) 
    AS subTable 

Hoặc ...

SELECT 
    ColumnA, 
    Column1 AS ColumnB, 
    Column2 AS ColumnC 
FROM 
    yourTable 
WHERE 
    ColumnA IS NULL 

UNION ALL 

SELECT 
    ColumnA, 
    Column2 AS ColumnB, 
    Column4 AS ColumnC 
FROM 
    yourTable 
WHERE 
    ColumnA IS NOT NULL 
1

hơn Một cách để lột da con mèo đặc biệt này:

SELECT ColumnA, 
     NVL2(ColumnA, Column3, Column1), 
     NVL2(ColumnA, Column4, Column2) 
    FROM TestTable 

Chia sẻ và thưởng thức.

+0

Lưu ý: 'NVL2()' lấy tham số chuỗi, có nghĩa là một diễn viên ngầm, và sau đó có thể quay lại kiểu dữ liệu gốc tùy theo nhu cầu. – MatBailie

+0

@Dems 'NVL2' hoạt động với" bất kỳ loại dữ liệu nào trừ LONG ": http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions120.htm#i91806 (Mặc dù nếu Cột [A | 1 | 2 | 3 | 4] là các loại khác nhau, sau đó chắc chắn có thể có vấn đề, nhưng đó là sự thật của bất kỳ câu trả lời ở đây.) –

+0

@ Dems: mỗi tài liệu cho NVL2 tại http://docs.oracle.com/cd/B28359_01 /server.111/b28286.pdf dường như nếu đối số thứ hai là số, cơ sở dữ liệu sẽ xác định đối số nào có ưu tiên số cao nhất và sẽ trả về giá trị của loại đó. Ngoài ra còn có một lưu ý rằng nó sẽ chấp nhận các tham số của bất kỳ loại nào, ngoại trừ LONG bị cấm đối số thứ hai và thứ ba. Ít nhất điều này dường như dưới 11.1. YMMV. –

Các vấn đề liên quan