2010-05-24 42 views
5

Tôi đã thiết lập chế độ xem kết hợp tất cả dữ liệu trên nhiều bảng. Có cách nào để viết điều này để chỉ các cột có chứa dữ liệu không null được hiển thị, và những cột có chứa tất cả các giá trị NULL không được bao gồm?Cách không hiển thị các cột NULL trong một chế độ xem

THÊM: Rất tiếc, vẫn đang nghiên cứu và làm việc trong dự án lớn đầu tiên của tôi nên mỗi ngày dường như là một trải nghiệm mới vào phút đó. Tôi đã không rõ ràng lắm, và đó là một phần vì tôi không chắc tôi sẽ làm đúng cách! Khách hàng là thư viện học tập và cơ sở dữ liệu ghi lại chi tiết về các bộ sưu tập cụ thể. Chế độ xem tôi đã đề cập là hiển thị tất cả dữ liệu được lưu trữ về một mục, vì vậy nó sẽ tập hợp các bảng về xuất bản, sao chép, tác giả, nhà xuất bản, ngôn ngữ, v.v. Một số lượng nhỏ các mục trong bộ sưu tập là các giấy tờ, do đó, có các chi tiết bổ sung hơn và cao hơn các chi tiết thư mục chuẩn. Những gì tôi không muốn là một người dùng để có được tất cả các lĩnh vực có sản phẩm nào liên quan đến giấy tờ nếu những gì đã được trả lại chỉ bao gồm sách, do đó các lĩnh vực bảng giấy là tất cả null. Vì vậy, tôi nghĩ có lẽ sẽ có một cách để không thể hiện những điều này. Ai đó đã nhận xét rằng đây là công việc của ứng dụng khách chứ không phải là chính cơ sở dữ liệu, vì vậy tôi có thể để điều này cho đến khi tôi đến giai đoạn đó của dự án.

+1

có vẻ dễ bị hiểu sai dữ liệu bảng, nếu định dạng thay đổi tùy thuộc vào nội dung ... –

+3

Vì vậy, nếu cột A cho bản ghi 1 có giá trị, nhưng cột của bản ghi 2 Giá trị là NULL - cột sẽ hiển thị trong lượt xem? –

+0

Điều này nghe giống như logic nên có trong GUI, không phải là cơ sở dữ liệu. Điều này sẽ không tuân theo hợp đồng truy xuất cơ sở dữ liệu thích hợp, vì bố cục có thể thay đổi bất kỳ lúc nào. – cjk

Trả lời

1
CREATE VIEW dbo.YourView 
AS 
    SELECT (list of fields) 
    FROM dbo.Table1 t1 
    INNER JOIN dbo.Table2 t2 ON t1.ID = t2.FK_ID 
    WHERE t1.SomeColumn IS NOT NULL 
    AND t2.SomeOtherColumn IS NOT NULL 

Định nghĩa chế độ xem của bạn, bạn có thể bao gồm WHERE điều kiện có thể loại trừ các hàng có các cột nhất định là NULL.

Cập nhật: bạn có thể không thực sự lọc ra cột - bạn xác định danh sách các cột là một phần của quan điểm của bạn trong định nghĩa khung nhìn của bạn, và danh sách này là cố định và không thể thay đổi động ......

Điều bạn có thể làm là xây dựng ISNULL(column, '') để thay thế các NULL đó bằng một chuỗi rỗng. Hoặc sau đó bạn cần xử lý loại trừ các cột trong giao diện người dùng hiển thị của bạn - không phải trong định nghĩa chế độ xem ...

Điều duy nhất tôi thấy bạn có thể làm là đảm bảo chỉ chọn những cột đó từ chế độ xem bạn biết là không phải là NULL:

SELECT (list of non-null fields) FROM dbo.YourView 
WHERE (column1 IS NOT NULL) 

và vân vân - nhưng không có cách nào đơn giản hay ma thuật để chọn tất cả các cột mà không phải là NULL trong một câu lệnh SELECT ...

+0

Đó có phải là những gì mà người đăng yêu cầu không? –

+1

Điều này sẽ lọc ra tất cả các hàng có chứa giá trị null trong các cột nhất định, đó là hơi khác với những gì tôi tin rằng poster là sau. – Justin

+0

Một yêu cầu khá kỳ lạ - nhưng các bạn có vẻ đúng ... hmm ... không thể nghĩ ra bất kỳ cách nào để thực hiện điều đó ..... ít nhất là không ở cấp độ SQL .... hoặc có thể là chỉ là một sự lựa chọn không may của các từ và OP thực sự có nghĩa là lọc ra hàng? Tôi không biết chắc chắn ... –

0

Nói chung, thêm một Mệnh đề WHERE cho truy vấn của bạn, vd

WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL 

Ở đây, b c là tên cột của bạn.

Nếu bạn đang nối các bảng với nhau trên các cột NULL có khả năng, sau đó sử dụng giá trị INNER JOIN và NULL sẽ không được bao gồm.

CHỈNH SỬA: Tôi có thể đã hiểu lầm - các bộ lọc ở trên có các hàng, nhưng bạn có thể yêu cầu lọc ra các cột, ví dụ: bạn có một số cột và bạn chỉ muốn hiển thị các cột có chứa ít nhất một giá trị null trên tất cả các hàng bạn đang quay trở lại. Sử dụng SQL động cung cấp giải pháp, vì các cột được đặt khác nhau tùy thuộc vào dữ liệu của bạn.

Đây là truy vấn SQL xây dựng một truy vấn SQL khác chứa các cột thích hợp. Bạn có thể chạy truy vấn này, và sau đó gửi kết quả của nó như một truy vấn khác. Nó giả định 'pk' là một số cột luôn luôn là không null, ví dụ: khóa chính - điều này có nghĩa là chúng tôi có thể thêm tiền tố tên hàng bổ sung bằng dấu phẩy.

SELECT CONCAT("SELECT pk" 
    CASE (count(columnA)) WHEN 0 THEN '' ELSE ',columnA' END, 
    CASE (count(columnB)) WHEN 0 THEN '' ELSE ',columnB' END, 
    // etc.. 
    ' FROM (YourQuery) base') 
FROM 
    (YourQuery) As base 

Truy vấn hoạt động bằng Đếm (cột) - hàm tổng hợp bỏ qua giá trị NULL và vì vậy trả về 0 cho một cột bao gồm toàn bộ NULL. Trình tạo truy vấn giả định rằng YourQuery sử dụng bí danh để đảm bảo không có tên cột trùng lặp.

Trong khi bạn không thể đặt điều này vào dạng xem, bạn có thể bọc nó thành một thủ tục được lưu trữ sao chép dữ liệu sang bảng khác - bảng kết quả. Bạn cũng có thể thiết lập trình kích hoạt để bảng kết quả được cập nhật bất cứ khi nào các bảng cơ sở thay đổi.

3

Không có cách nào để thực hiện việc này trong sql.

+1

Tôi đã bị cám dỗ để trả lời như thế này, nhưng nó phụ thuộc vào hệ thống cơ sở dữ liệu. Tôi kể từ khi nghĩ rằng nó có thể có thể với một bảng tạm thời, nhưng logic sẽ được khá phức tạp. Có thể làm điều đó với SQL được tạo động, nhưng phương pháp đó thậm chí còn cẩn trọng hơn. – eksortso

+2

Không thể sử dụng một trong các kỹ thuật đó trong chế độ xem. –

+2

110% chính xác. SQL = đầu ra cột cố định. – gbn

0

Nếu chúng tôi đang đọc câu hỏi của bạn đúng, sẽ không có cách nào để làm điều này trong SQL. Đầu ra của một khung nhìn phải là một mối quan hệ - trong (over-) các thuật ngữ đơn giản hóa, nó phải là hình chữ nhật. Tức là, mỗi hàng phải có cùng số cột.

Nếu bạn có thể cho chúng tôi biết thêm về dữ liệu của bạn và cho chúng tôi biết bạn muốn làm gì với đầu ra, chúng tôi có thể đưa ra các đề xuất tích cực hơn.

0

Bạn không thể thực hiện việc này trong chế độ xem, nhưng bạn có thể làm điều đó khá dễ dàng bằng cách sử dụng SQL động trong quy trình được lưu trữ. Tất nhiên, việc có một lược đồ thay đổi không nhất thiết phải tốt cho những khách hàng sử dụng dữ liệu, nhưng nó có thể hiệu quả nếu bạn có dữ liệu rất thưa thớt và khách hàng tiêu thụ hiểu được lược đồ thay đổi.

Nếu bạn phải có chế độ xem, bạn có thể đặt hàng "tiêu đề" trong chế độ xem của mình, bạn có thể kiểm tra phía máy khách trên hàng đầu tiên trong vòng lặp của mình để xem bạn có muốn không bận tâm với cột trong lưới hoặc bất cứ điều gì, bạn có thể làm một cái gì đó như thế này:

SELECT * FROM (
    -- This is the view code 
    SELECT 'data' as typ 
      ,int_col 
      ,varchar_col 
    FROM TABLE 

    UNION ALL 

    SELECT 'hdr' as typ 
      -- note that different types have to be handled differently 
      ,CASE WHEN COUNT(int_col) = 0 THEN NULL ELSE 0 END 
      ,CASE WHEN COUNT(varchar_col) = 0 THEN NULL ELSE '' END 
    FROM TABLE 
) AS X 
-- have to get header row first 
ORDER BY typ DESC -- add other sort criteria here 
0

Tôi nghi ngờ những gì đang xảy ra là người dùng cuối đang chạy CrystalReport và phàn nàn về tất cả các cột trống phải được loại bỏ thủ công.

Nó thực sự sẽ có thể tạo ra một thủ tục lưu sẵn mà có thể tạo ra một cái nhìn trên bay, rời khỏi cột dataless. Nhưng sau đó bạn sẽ phải chạy proc này trước khi sử dụng xem.

Điều đó có được chấp nhận không?

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