2010-03-07 35 views
37

Tôi có một bảng với các cột sau: EntityId, EntityName, EntityProfile, .................Làm cách nào để chọn đúng/sai dựa trên giá trị cột?

Tôi muốn chọn Id và Tên và đúng/cột sai dựa trên giá trị của cấu hình thực thể, ví dụ một tập hợp kết quả trả về như dưới đây, có nghĩa là các thực thể 1 & 2 có cấu hình trong khi 3 không.

1 Name1 True 
2 Name2 True 
3 Name3 False 
etc..... 

Tôi biết tôi có thể làm điều đó bằng cách sử dụng chức năng mà trở về đúng/sai dựa trên giá trị hồ sơ như thế này: CHỌN ENTITYID, Tên pháp nhân, dbo.EntityHasProfile (ENTITYID) AS HasProfile TỪ Entities

nhưng Tôi đang trả lại số không lớn. của hồ sơ và với chức năng này gọi cho mỗi bản ghi, truy vấn là rất chậm, và khi tôi loại bỏ các chức năng gọi thời gian thực hiện truy vấn giảm đáng kể.

Vậy có cách nào khác để thực hiện việc này không? Cảm ơn

+2

Bạn có thể có thể 'tham gia', nhưng bạn không cho chúng tôi biết cách tính' EntityHasProfile'. Bạn có bàn khác không? – Kobi

+0

xin lỗi Tôi quên đề cập đến, hồ sơ thực thể là nvarchar (tối đa) – Yasmine

+0

Và làm thế nào để bạn sử dụng EntityProfile để xác định liệu EntityHasProfile? Nếu nó là null ...? – froadie

Trả lời

73

Sử dụng số CASE. Tôi sẽ đăng mã cụ thể, nhưng cần nhiều thông tin hơn được cung cấp trong bài đăng - chẳng hạn như kiểu dữ liệu của EntityProfile và những gì thường được lưu trữ trong đó. Một cái gì đó như:

CASE WHEN EntityProfile IS NULL THEN 'False' ELSE 'True' END 

Sửa - toàn bộ câu lệnh SELECT, theo các thông tin trong các ý kiến:

SELECT EntityID, EntityName, 
     CASE WHEN EntityProfile IS NULL THEN 'False' ELSE 'True' END AS HasProfile 
FROM Entity 

Không LEFT JOIN cần thiết trong trường hợp này ...

+0

Điều gì xảy ra nếu tôi có 20 cột trở lên có bit (đúng/sai) kiểu dữ liệu? Cũng có thể được áp dụng như vậy @froadie – Kopika

+2

Để mở rộng câu trả lời này, câu trả lời này sẽ trả về một lỗi là Đúng hoặc Sai. Nó hoàn toàn thỏa mãn OP nhưng có thể hữu ích hơn như một trường T/F bit thực tế (như đã đề cập bởi Kopika). Tôi sẽ sử dụng này tuyên bố trường hợp: CHỌN ENTITYID, Tên pháp nhân, cast (CASE KHI EntityProfile IS NULL THEN ELSE 0 END 1) như bit) AS HasProfile TỪ Entity – Rob

+0

@ Rob Cảm ơn vì điều đó. nhưng ngoặc đơn mở một lần, đóng hai lần? – Jasir

6

Bạn có thể thử một cái gì đó giống như

SELECT e.EntityId, 
     e.EntityName, 
     CASE 
      WHEN ep.EntityId IS NULL THEN 'False' 
      ELSE 'TRUE' 
     END AS HasProfile 
FROM Entities e LEFT JOIN 
     EntityProfiles ep ON e.EntityID = ep.EntityID 

Hoặc

SELECT e.EntityId, 
     e.EntityName, 
     CASE 
      WHEN e.EntityProfile IS NULL THEN 'False' 
      ELSE 'TRUE' 
     END AS HasProfile 

FROM Entities e 
0

nào UDF EntityHasProfile() làm gì?

Thông thường bạn có thể làm một cái gì đó như thế này với một LEFT JOIN:

SELECT EntityId, EntityName, CASE WHEN EntityProfileIs IS NULL THEN 0 ELSE 1 END AS Has Profile 
FROM Entities 
LEFT JOIN EntityProfiles 
    ON EntityProfiles.EntityId = Entities.EntityId 

này nên loại bỏ một nhu cầu cho một cuộc gọi vô hướng UDF tốn kém - theo kinh nghiệm của tôi, UDFs vô hướng phải là một phương sách cuối cùng cho hầu hết các thiết kế cơ sở dữ liệu vấn đề trong SQL Server - họ chỉ đơn giản là không tốt biểu diễn.

+0

thì udf được coi là kiểm tra giá trị của cấu hình thực thể cho id được truyền, nếu null trả về false khác trả về true – Yasmine

4

Nếu cách bạn xác định một thực thể có cấu hình là một hàm xác định và không yêu cầu bất kỳ quyền truy cập nào vào bảng khác, bạn có thể viết hàm được lưu trữ và xác định trường được tính toán, được lưu giữ sẽ lưu trữ giá trị đó cho bạn và không có để tính lại nó nhiều lần.

Nếu bạn cần truy vấn một bảng riêng biệt (ví dụ: kiểm tra sự tồn tại của một hàng), bạn vẫn có thể tạo cột "HasProfile" trong bảng tổ chức của mình và chỉ tính toán trường đó một cách thường xuyên, ví dụ: mỗi đêm. Nếu bạn có giá trị được lưu trữ dưới dạng giá trị nguyên tử, bạn không cần tính toán mỗi lần. Điều này hoạt động miễn là thực tế - có tiểu sử hay không - không thay đổi quá thường xuyên.

Để thêm một cột để kiểm tra hay không EntityProfile là trống rỗng, làm một cái gì đó như thế này:

CREATE FUNCTION CheckHasProfile(@Field VARCHAR(MAX)) 
RETURNS BIT 
WITH SCHEMABINDING 
AS BEGIN 
    DECLARE @Result BIT 

    IF @Field IS NULL OR LEN(@Field) <= 0 
     SET @Result = 0 
    ELSE 
     SET @Result = 1 

    RETURN @Result 
END 

và sau đó thêm một cột tính toán mới để bàn của bạn Entity:

ALTER TABLE dbo.Entity 
    ADD HasProfile AS dbo.CheckHasProfile(EntityProfile) PERSISTED 

Bây giờ bạn có cột BIT và nó vẫn tồn tại, ví dụ không được tính mỗi lần truy cập vào hàng và sẽ hoạt động tốt!

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