SQL-сервер 2000:Возвращает «истину» или «ложь» в зависимости от того, что любой 1 из 25 столбцов является «истиной».
-
06-07-2019 - |
Вопрос
Мне нужно создать запрос, который проверяет несколько разных столбцов, и если в каком-либо из них есть 1, я хочу вернуть true.
Идеальный результат будет примерно таким:
ID:55
Имя: Джон Доу
ИсДилерТип1: Истина
ИсДилерТип2: Верно
ИсДилерТип3: Ложь
ИсДилерТип4: Ложь
IsDealerType5: Правда
Проблема в том, что вместо этих 5 столбцов дилеров у меня есть около 20 столбцов с именами 1a, 1b, 1c, 1d и т. д.Если любой из столбцов «1» имеет значение true, то IsDealerType1 должно иметь значение true.
Я стараюсь не писать что-то в коде 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
...но, очевидно, я делаю это неправильно.
Любая помощь приветствуется.Спасибо!
Решение
Мне нравится Рассел, но я добавлю еще вот что:
CASE WHEN 1 IN (1a,1b,1c,1d) THEN 1 ELSE 0 END As IsDealerType1
Другие советы
СЛУЧАЙ, КОГДА (1a + 1b + 1c + 1d) > 0, ТОГДА 1 ELSE 0 КОНЕЦ как IsDealerType1
Используйте SQL побитовое ИЛИ оператор.Избегает сравнений и приведения.
Пример:Ответы Джоэла передают клиенту целое число 1 или 0, где вы, вероятно, ожидаете бит (логическое значение).Ответы Ремуса требуют сравнения и сравнения.
SELECT id,
name,
(1a | 1b | 1c | 1d) as IsDealerType1,
(2a | 2b | 2c | 2d) as IsDealerType2
where id = 55
В SQL типы BIT нельзя использовать в логических выражениях (ох!!), их нужно сравнивать с целыми числами:
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