Избегайте повторных столбцов из оператора выбора - PullRequest
0 голосов
/ 02 июля 2018

Моя база данных содержит таблицу person с этими полями username, name, online, visible, ...

У меня есть следующий запрос для извлечения человека

SELECT *,
    CASE
        WHEN online = 0 THEN 0
        WHEN visible = 0 THEN 0
        ELSE online
    END AS online
FROM person
where id = SOMEID

Я пытаюсь перевести онлайн / офлайн с учетом установленной пользователем логики видимости прямо в запрос. В основном показывать онлайн-статус в зависимости от статуса видимости (если пользователь выбрал быть невидимым, показывать в автономном режиме, даже если пользователь онлайн).

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

username | name | online | visible | ... | online
x        | x    | x      | x       | ... | x

По причинам, не зависящим от меня, я застрял с использованием SELECT * вместо того, чтобы вручную вводить столбцы как SELECT username, name, visible, .... Есть ли способ исключить поле online из SELECT *? Поскольку он будет создан оператором CASE позже.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Такая функция не существует ни в Postgres, ни в SQL. Я думаю, что это довольно интересный вопрос, поэтому я немного погуглил и наткнулся на интересную статью на postgresonline.com .

Они показывают подход, который выбирает столбцы непосредственно из схемы:

  SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
          FROM information_schema.columns As c
              WHERE table_name = 'officepark' 
              AND c.column_name NOT IN('officeparkid', 'contractor')
      ), ',') || ' FROM officepark As o' As sqlstmt

Вы можете создать функцию, которая делает что-то подобное. Такие темы также обсуждались в списках рассылки, но общий консенсус был почти таким же: запросить схему.

Я уверен, что есть и другие решения, но я думаю, что все они будут включать в себя какую-то магическую схему-запрос-foo.

Кстати: будьте осторожны с SELECT * ..., так как это может привести к снижению производительности

0 голосов
/ 02 июля 2018

К сожалению, * означает все столбцы, нет возможности исключить конкретный столбец из выбора *. Может быть, вы можете назвать свой столбец как-то иначе, например «online_status» и использовать «online_status» в своем коде вместо столбца «online».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...