열 값을 기준으로 참/거짓을 선택하는 방법은 무엇입니까?
다음 열이 있는 테이블이 있습니다.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
'source' 카테고리의 다른 글
SQLAlchemy를 사용하여 Oracle 데이터베이스에 연결 (0) | 2023.06.23 |
---|---|
C NULL이 C++11 Nullptr과 같습니까? (0) | 2023.06.23 |
$209 달러 몽고드의 $프로젝트 (0) | 2023.06.23 |
C에서 음의 숫자를 이동합니다. (0) | 2023.06.23 |
Android 응용 프로그램에서 활동 간에 데이터를 전달하려면 어떻게 해야 합니까? (0) | 2023.06.18 |