2010-11-04 3 views
0

У меня есть таблица базы данных, как, что: -Как просмотреть строку или обновить столбец в таблице базы данных в зависимости от значений других столбцов?

Table1

Column1 : Varchar(50) 
Column2 : Varchar(50) 
Column3 : Boolean 
Column4 : Varchar(50) 
Column5 : Varchar(50) 

Я хотел бы создать фиктивный столбец -или добавить новый столбец в table- при запуске SQL оператор так, что значение это столбец будет содержать строку, указывающую состояние деления строки строки на более чем одном из этих столбцов. Я имею в виду, что эти столбцы имеют значения Null или нет.

Логический способ представления, что: -

Выберите переключатель DummyColumn

"status1" Case column1 IS NOT NULL 
"status2" Case column2 IS NOT NULL 
"status3" Case column3 IS NOT NULL 
"status4" Case column1 IS NOT NULL AND column2 IS NOT NULL 
"status5" Case column2 IS NOT NULL AND column3 IS NULL 
"status6" Case column2 IS NOT NULL OR column3 IS NOT NULL 

От Table1;

В Business Logic я могу сказать, что хочу отобразить строку, указывающую состояние элемента в базе данных, находящуюся во многих других столбцах состояния, которые могут быть boolen или string, и этот статус может иметь много значений в соответствии со значениями хранится в этих столбцах таблицы.

Моя база данных - Sybase.

Как я могу построить свой SQL-запрос для этого? что может быть вызвано этим вопросом? Как я могу найти или найти это? Я не знаю, в какой теме я могу найти это? Я ищу о слиянии, слиянии, замене, NVL и Союзе, но я не нахожу то, что ищу.

Спасибо в Advance, и я надеюсь, что я хорошо выскажу свой вопрос и что это дубликат, и я надеюсь, что найдем для этого хороший ответ как можно скорее ..

+1

@ user493325, вы понимаете, что Status6 никогда не будет возвращен, поскольку он будет переопределен Status1 или Status2, даже если Status4 и Status5 не применимы? –

ответ

0

Существует несколько способов кошки кошки, это один из них.

SELECT t.Column1 
     , t.Column2 
     , t.Column3 
     , t.Column4   
     , t.Column5 
     , t.Column6 
     , COALESCE(Status1, Status2, Status3, Status4, Status5, Status6) AS DummyColumn 
FROM (
      SELECT * 
        , CASE WHEN Column1 IS NOT NULL THEN 'status1' ELSE NULL END AS Status1 
        , CASE WHEN Column2 IS NOT NULL THEN 'status2' ELSE NULL END AS Status2 
        , CASE WHEN Column3 IS NOT NULL THEN 'status3' ELSE NULL END AS Status3 
        , CASE WHEN Column1 IS NOT NULL AND Column2 IS NOT NULL THEN 'status4' ELSE NULL END AS Status4 
        , CASE WHEN Column2 IS NOT NULL AND Column3 IS NULL THEN 'status5' ELSE NULL END AS Status5 
        , CASE WHEN Column2 IS NOT NULL OR Column3 IS NOT NULL THEN 'status6' ELSE NULL END AS Status6 
      FROM Table1 
     ) t 

Обратите внимание, что это работает, используя SQL Server, а как нет тайных конструкций, участвующих, она должна быть относительно легко преобразовать это SyBase.

+0

, вы должны, вероятно, переупорядочить предложение COALESCE - в настоящее время статусы с 4 по 6 никогда не будут выбраны, потому что они будут переопределены статусами от 1 до 3. –

+0

Вы правы, я этого не заметил. Это то, что может решить только OP: либо status1 должен быть возвращен, либо status4. Перетасовка заявления COALESCE действительно является решением. –

+0

Большое спасибо за ваш ответ, который дает мне подсказку, чтобы найти решение рядом с этим с помощью Nested (Case When .. Then ..) Заявления в Sybase T-SQL, поскольку я не использовал псевдонимы COALESCE и таблицы, но у меня есть требуемые результаты , Большое спасибо за других (особенно Марк Баннистер), которые комментировали вопрос и ответ и делают его более понятным. – TopDeveloper

1

Использование одного подзапросов в:

SELECT Column1, 
     Column2, 
     Column3, 
     Column4,  
     Column5, 
     Column6, 
     CASE WHEN Column1 IS NOT NULL AND Column2 IS NOT NULL THEN 'status4' 
      WHEN Column2 IS NOT NULL AND Column3 IS NULL THEN 'status5' 
      WHEN Column1 IS NOT NULL THEN 'status1' 
      WHEN Column2 IS NOT NULL THEN 'status2' 
      WHEN Column3 IS NOT NULL THEN 'status3' 
      WHEN Column2 IS NOT NULL OR Column3 IS NOT NULL THEN 'status6' 
     END AS Dummy_Column 
FROM Table1 

NB. Status6 никогда не будет возвращен, потому что он будет переопределен Status1 или Status2, даже если Status4 и Status5 не применимы.

+0

Если вам нужно выбрать на основе статуса, проще всего обернуть такой запрос, как Bannister, в внешний запрос, чтобы вы могли просто работать с «Dummy_column» и не требовать повторения всего оператора case. Кроме того, НЕ добавляйте в базу данных для этого столбца. Это выводится, поэтому выводить его на лету каждый раз, когда вам это нужно.Тогда вам не нужно беспокоиться о том, что он не синхронизируется с базовыми данными. – Jay

+0

@Jay - или вы можете настроить представление базы данных на основе запроса выше, а затем использовать представление по мере необходимости. –

+0

@Bannister: Истина, в зависимости от того, нужно ли вам просто делать это для одного запроса, и в этом случае я бы не сделал вид, так как он просто сломал бы код на два места; или вы планируете использовать его во многих местах, и в этом случае представление будет означать, что вы не повторяетесь. – Jay

Смежные вопросы