2010-03-07 3 views
37

У меня есть таблица со следующими столбцами: EntityId, EntityName, EntityProfile, .................Как выбрать true/false на основе значения столбца?

Я хочу, чтобы выбрать идентификатор и имя и правда/ложный столбец на основе значения профиля сущности, , например, возвращаемого результирующего набора, как показано ниже, будет означать, что объекты 1 & 2 имеют профили, а 3 нет.

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

Я знаю, что могу сделать это с помощью функции, которая возвращает истину/ложь в зависимости от значения профиля, как это: ВЫБРАТЬ EntityId, EntityName, dbo.EntityHasProfile (EntityId) AS HasProfile ОТ Entities

но Я возвращаю большой нет. записей и с этим вызовом функции для каждой записи, запрос выполняется очень медленно, и когда я удаляю вызов функции, время выполнения запроса значительно падает.

Так есть ли другой способ сделать это? Благодаря

+2

Возможно, вы можете «присоединиться», но вы не сказали нам, как рассчитывается «EntityHasProfile». У вас есть другой стол? – Kobi

+0

жаль, что я забыл упомянуть, что профиль сущности nvarchar (max) – Yasmine

+0

И как вы используете EntityProfile для определения EntityHasProfile? Если это null ...? – froadie

ответ

73

Использовать CASE. Я бы опубликовал конкретный код, но вам нужно больше информации, чем указано в сообщении, например, тип данных EntityProfile и то, что обычно хранится в нем. Что-то вроде:

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

Edit - вся ЗЕЬЕСТ, согласно информации в комментариях:

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

Нет LEFT JOIN необходимо в этом случае ...

+0

Что делать, если у меня есть столбцы 20 и выше, которые имеют бит (true/false)? Может ли это быть применено @froadie – Kopika

+2

Чтобы расширить этот ответ, это возвращает жало True или False. Он полностью удовлетворяет OP, но может быть более полезным как фактическое поле бит T/F (как упоминалось Копикой). Я хотел бы использовать этот случай заявление: ВЫБЕРИТЕ EntityId, EntityName, литая (случай, когда EntityProfile IS NULL THEN 0 ELSE 1 END), как бит) AS HasProfile ОТ Entity – Rob

+0

@Rob Спасибо за это. но скобки открываются один раз, закрываются дважды? – Jasir

6

Вы можете попробовать что-то вроде

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

Что ОДС EntityHasProfile() делать?

Обычно вы могли бы сделать что-то подобное с 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 

Это должно устранить необходимость дорогостоящего вызова скалярной UDF - в моем опыте, скалярный UDFs должен быть последним средством для большинства проектирования баз данных проблемы в SQL Server - они просто не очень хорошие исполнители.

+0

udf должен проверить значение профиля сущности для пройденного id, если null возвращает false else возвращает true – Yasmine

4

Если вы определяете, является ли объект профилем детерминированной функцией и не требует какого-либо доступа к другой таблице, вы можете написать хранимую функцию и определить вычисленное, постоянное поле, которое сохранит это значение для вас и не будетповторять его снова и снова.

Если вам нужно запросить отдельную таблицу (например, проверить наличие строки), вы все равно можете сделать этот «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, и он сохраняется, например не вычисляется каждый раз, чтобы получить доступ к строке, и должен выполнять просто отлично!

Смежные вопросы