#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть большая таблица, из которой я выбрал несколько строк, идентификатор которых (321,900,123)
id | col1 | col2 | col3
-----------------------
321| 1 | 0 | 0
900| 0 | 0 | 0
123| 0 | 0 | 1
Я хочу вернуть
col1 и col3, потому что они содержат 1. Как?
Я делаю медленный способ применения объединения к операторам выбора. Должен быть лучший способ. В будущем у меня может быть больше столбцов, поэтому это жесткое кодирование не подходит.
select col1 from table where id in (321,900,123) and col1=1
union select col2 from table where id in (321,900,123) and col2=1
union select col3 from table where id in (321,900,123) and col3=1
Комментарии:
1. Вы пытались объединить команду в виде строки и
EXEC (@command)
?2. итак, я буду использовать эту же команду?
3. @waterling — Можете ли вы сказать мне, это просто игрушечный проект или он из базы данных какой-то компании? Интересно, почему кто-то хотел бы сделать такой запрос. Кстати, почему вы думаете, что это медленно?
4. Я просто пытаюсь настроить некоторые разрешения. в этой таблице указано, имеет ли идентификатор разрешение для каждого столбца 🙂 это медленно, потому что вы выполняете отдельные операторы выбора и объединяете результаты вместо выполнения одного?
5. Какой результат вы хотите получить от своего запроса? Предоставленный вами запрос будет содержать либо нулевые строки, либо одну строку с именем одного столбца
col1
, содержащего a1
. Другие результаты этого запроса невозможны, независимо от того, какие данные вы помещаете в свою таблицу. Я не думаю, что это то, что вы ищете.
Ответ №1:
Один из способов приблизиться к этому, поскольку они являются числовыми значениями, — это суммировать два столбца:
select col1 col3 as selected
from tab
where id in (321,900,123)
and col1 col3>=1
Но в этом есть некоторые встроенные предположения. В зависимости от ваших требований, это может сработать для вас. Скрипка. (Жаль, что sql server не разрешает псевдонимы столбцов в where
предложении, поскольку это было бы лучше читать как and selected>=1
.)
Другим способом было бы сделать что-то вроде:
select 1
from tab
where id in (321,900,123)
and ( col1=1
or col3=1 )
Но опять же зависит от ваших точных требований