выберите несколько столбцов, содержащих определенное значение

#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 , содержащего a 1 . Другие результаты этого запроса невозможны, независимо от того, какие данные вы помещаете в свою таблицу. Я не думаю, что это то, что вы ищете.

Ответ №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 )
 

Но опять же зависит от ваших точных требований