source

열 값을 기준으로 참/거짓을 선택하는 방법은 무엇입니까?

factcode 2023. 6. 23. 22:27
반응형

열 값을 기준으로 참/거짓을 선택하는 방법은 무엇입니까?

다음 열이 있는 테이블이 있습니다.EntityId, EntityName, EntityProfile, ...............

엔티티 프로파일 값을 기준으로 ID 및 이름과 true/false 열을 선택하려고 합니다. 예를 들어, 아래와 같이 반환된 결과 집합은 엔티티 1&2가 프로파일을 가지고 있지만 3은 프로파일을 가지고 있지 않다는 것을 의미합니다.

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

SELECT EntityId, EntityName, dbo와 같은 프로파일 값을 기준으로 true/false를 반환하는 함수를 사용하여 수행할 수 있습니다.엔티티에 프로파일(EntityId)이 있고 엔티티에 프로파일이 있음

그러나 나는 많은 레코드 수를 반환하고 있으며 각 레코드에 대한 이 함수 호출로 쿼리 실행 시간이 매우 느리고 함수 호출을 제거하면 쿼리 실행 시간이 크게 감소합니다.

그래서 이것을 하는 다른 방법이 있을까요?감사해요.

사용CASE저는 특정 코드를 게시할 것이지만, EntityProfile의 데이터 유형 및 일반적으로 저장되는 정보와 같은 포스트에서 제공되는 것보다 더 많은 정보가 필요합니다.다음과 같은 것:

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

편집 - 설명에 있는 정보에 따라 전체 SELECT 문을 선택합니다.

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

이 경우 LEFT JOIN이 필요하지 않습니다...

당신은 다음과 같은 것을 시도할 수 있습니다.

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

또는

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

FROM    Entities e

너무 늦었을 수도 있지만 0/1을 비트로 캐스팅하여 .NET 프레임워크에서 사용할 경우 데이터 유형이 True/False가 됩니다.

SELECT   EntityId, 
         EntityName, 
         CASE 
            WHEN EntityProfileIs IS NULL 
            THEN CAST(0 as bit) 
            ELSE CAST(1 as bit) END AS HasProfile
FROM      Entities
LEFT JOIN EntityProfiles ON EntityProfiles.EntityId = Entities.EntityId`

엔티티에 프로파일이 있는지 여부를 결정하는 방법이 결정론적 함수이며 다른 테이블에 대한 액세스가 필요하지 않은 경우 저장된 함수를 작성하고 해당 값을 저장하고 반복해서 계산할 필요가 없는 계산된 지속 필드를 정의할 수 있습니다.

별도의 테이블을 쿼리해야 하는 경우(예: 행의 존재 확인)에도 이 "HasProfile"을 엔티티 테이블의 열로 만들고 매일 밤 등 정기적으로 필드를 계산할 수 있습니다.값이 원자 값으로 저장되어 있으면 매번 계산할 필요가 없습니다.프로필이 있든 없든 사실이 너무 자주 바뀌지 않는 한 이것은 효과가 있습니다.

열을 추가하여 확인하는 방법EntityProfile비어 있는 경우 다음과 같은 작업을 수행합니다.

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

그런 다음 새 계산 열을 테이블에 추가합니다.Entity:

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

이제 BIT 열이 있고 이 열은 지속됩니다. 예를 들어 행에 액세스할 때마다 계산되지 않으므로 성능이 양호해야 합니다.

적어도 Postgres에서는 다음 문장을 사용할 수 있습니다.

SELECT EntityID, EntityName, EntityProfile IS NOT NULL AS HasProfile FROM Entity

UDF 엔티티 HasProfile()은 무엇을 합니까?

일반적으로 왼쪽 조인으로 다음과 같은 작업을 수행할 수 있습니다.

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

이렇게 하면 비용이 많이 드는 스칼라 UDF 호출이 필요하지 않습니다. 제 경험에 따르면 스칼라 UDF는 SQL Server의 대부분의 데이터베이스 설계 문제에 대한 최후의 수단이 되어야 합니다. 이들은 성능이 좋지 않습니다.

언급URL : https://stackoverflow.com/questions/2396889/how-to-select-true-false-based-on-column-value

반응형