Вычисляемый столбец на основе обнуляемых столбцов - PullRequest
1 голос
/ 06 июля 2011

Я хочу создать вычисляемый столбец, который является объединением нескольких других столбцов.В приведенном ниже примере fulladdress равен нулю в наборе результатов, когда любой из «реальных» столбцов равен нулю.Как я могу настроить функцию вычисляемого столбца, чтобы она учитывала пустые столбцы?

CREATE TABLE Locations
(
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [fulladdress]  AS (((([address]+[address2])+[city])+[state])+[zip]),
    [address] [varchar](50) NULL,
    [address2] [varchar](50) NULL,
    [city] [varchar](50) NULL,
    [state] [varchar](50) NULL,
    [zip] [varchar](50) NULL
)

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 06 июля 2011

Это довольно быстро, но вот начало:

ISNULL(address,'')      + ' ' 
  + ISNULL(address2,'') + ' '
  + ISNULL(city,'')     + ' ' 
  + ISNULL(state,'')    + ' '
  + ISNULL(zip,'')

(Если isnull не работает, вы можете попробовать coalesce. Если ни одна из них не работает, поделитесь тем, какой DMBS вы используете.)

1 голос
/ 06 июля 2011

В вашей базе данных не должно быть столбца полного адреса (который является дубликатом других столбцов), если у вас нет веской причины. Правильный способ - построить полную строку адреса в ваших запросах. Создавая поле динамически, вы уменьшаете избыточность в таблице, и у вас остается на один столбец меньше для поддержки (который необходимо будет обновлять при любых других изменениях столбца).

В вашем запросе вы бы сделали что-то вроде

SELECT CONCAT(ISNULL(address,''), ISNULL(address2,''), ISNULL(city,''), ISNULL(state,''), ISNULL(zip,'')) AS fulladdress FROM Locations; 

Функция CONCAT() выполняет конкатенацию, а ISNULL() дает вам строку, если она не равна нулю, или второй параметр (который был передан как ''), если он равен нулю

...