Sql Server 2000: возвращать значение «истина» или «ложь» на основании того, что любой из 25 столбцов является «истиной» - PullRequest
1 голос
/ 24 октября 2009

Мне нужно создать запрос, который проверяет несколько разных столбцов, и если у любого из них есть 1, я хочу вернуть true.

Идеальный результат будет выглядеть следующим образом:

ID: 55
Имя: Джон Доу
IsDealerType1: Правда
IsDealerType2: Правда
IsDealerType3: Ложные
IsDealerType4: Ложные
IsDealerType5: True

Проблема в том, что вместо этих 5 столбцов дилера у меня есть около 20 столбцов с именами 1a, 1b, 1c, 1d и т. Д. Если любой из столбцов «1» имеет значение true, то IsDealerType1 должен быть истинным.

Я пытаюсь избежать написания чего-либо в коде VB.NET для проверки каждого столбца, просто потому, что в SQL должно быть легко избежать этого безобразия - если бы я только знал, как это сделать - но я не уверен, как построить запрос. Я пытался что-то вроде ...

SELECT id, 
      name, 
      (1a or 1b or 1c or 1d) as IsDealerType1, 
      (2a or 2b or 2c or 2d) as IsDealerType2 
where id = 55

... но, очевидно, я делаю это неправильно.

Любая помощь приветствуется. Спасибо!

Ответы [ 4 ]

10 голосов
/ 24 октября 2009

Мне нравится Рассел, но я также добавлю это:

CASE WHEN 1 IN (1a,1b,1c,1d) THEN 1 ELSE 0 END As IsDealerType1
5 голосов
/ 24 октября 2009

СЛУЧАЙ, КОГДА (1a + 1b + 1c + 1d)> 0 ТОГДА 1 ИЛИ 0 КОНЕЦ как IsDealerType1

2 голосов
/ 24 октября 2009

Используйте оператор SQL поразрядно ИЛИ . Избегает сравнений и приведений.

Пример. В ответах Джоэла клиенту передается целое число 1 или 0, где вы, вероятно, ожидаете бит (логическое значение). Ответы Ремуса требуют приведения и сравнения.

SELECT id, 
      name, 
      (1a | 1b | 1c | 1d) as IsDealerType1, 
      (2a | 2b | 2c | 2d) as IsDealerType2 
where id = 55
1 голос
/ 24 октября 2009

В SQL типы BIT нельзя использовать в логических выражениях (d'oh !!), их нужно сравнивать с целыми числами:

SELECT id, name, 
   cast(
    case when ([1a]=1 or [1b]=1 or [1c]=1 or [1d]=1) then 1 else 0 end
    as bit) as IsDealerType1,
    cast(case when ([2a]=1 or [2b]=1 or [2c]=1 or [2d]=1) then 1 else 0 end
    as bit) as IsDealerType2 
from [table]
where id = 55
...