Является ли одно из моих полей БД НУЛЕМ? - PullRequest
0 голосов
/ 22 июня 2009

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

Это выглядит примерно так:

refID    field1    newField1    field2    newField2   ... 

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

Теперь мне нужен запрос, который говорит мне, учитывая refID, если есть какие-либо предлагаемые изменения в таблице подробностей.

Я немного поигрался с некоторыми селекторами UNION, с COALESCE () и ISNULL () ... но все эти попытки в лучшем случае выглядели немного странно. БД MS-SQL-Server 2005.

Для прояснения моей проблемы:

--this is a simplification of the details table in question
CREATE TABLE [dbo].[TEST_TABLE](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [refID] [int] NOT NULL,
    [firstName] [varchar](50) NULL,
    [newFirstName] [varchar](50) NULL,
    [lastName] [varchar](50) NULL,
    [newLastName] [varchar](50) NULL
)

--here we insert a detail row ... one of many that might exist for the master table (e.g. data about the company)
insert into TEST_TABLE(refID, firstName, lastName) values(666, 'Bill', 'Ballmer')
--this is what happens when a user saves a suggested change
update TEST_TABLE SET newLastName = 'Gates' where ID = 1
--and this is what happens when this suggestion is accepted by a second user
update TEST_TABLE set lastName=newLastName, newLastName = NULL where ID = 1

Ответы [ 5 ]

2 голосов
/ 22 июня 2009

Это самое чистое решение, которое я могу придумать на макушке. Вам нужно будет повторить логику для каждого элемента данных (col1, col2 и т. Д.):

DECLARE @RefID int, @Changes bit

SET @Changes = 0 --No changes by default

SET @RefID = 42 --Your RefID

IF EXISTS(SELECT * FROM MyDetailTable
          WHERE RefID = @RefID
          AND (
          (Col1 IS NULL AND NewCol1 IS NOT NULL)
          OR 
          (Col1 IS NOT NULL AND NewCol1 IS NULL)
          OR
          (Col1 <> Col2)
          ))
   SET @Changes = 1
1 голос
/ 23 июня 2009

Вот простой запрос:

    SELECT TOP 1 1 as found
      FROM [dbo].[TEST_TABLE] t
     WHERE COALESCE(t.newFirstName,t.newLastName) IS NOT NULL
       AND t.refID = 1

Этот запрос вернет одну строку, если есть какие-либо предлагаемые изменения для данного refID (на основе примера в вашем вопросе.)

Конечно, для вашей фактической таблицы вам необходимо перечислить каждый из столбцов 'newValue' в качестве аргументов в функции COALESCE. (В списке слияния я рекомендую явно приводить любой не-VARCHAR к VARCHAR, просто чтобы было ясно, что каждое выражение в списке имеет один и тот же тип данных.

Если вы предпочитаете использовать выражение CASE, а не COALESCE:

    SELECT TOP 1 1 as found
      FROM [dbo].[TEST_TABLE] t
     WHERE CASE 
           WHEN t.newFirstName IS NOT NULL THEN 1
           WHEN t.newLastName  IS NOT NULL THEN 1
           ELSE NULL
           END IS NOT NULL
       AND t.refID = 1
1 голос
/ 22 июня 2009

Я модифицировал раствор Рандолфоса.

 select 
        refID ,
        case when 
            newField1 is not null or
            newField2 is not null or
            ...
        then 1 else 0 end  haschanged
    from myTable
    where refID = @refID

Обновление: в основном то, что сказал Арон Аалтон в другом формате вывода.

0 голосов
/ 22 июня 2009

Не могу проверить это, но возможно:

select (field1 is not null and field2 is not null) as ChangesMade where refID = @id
0 голосов
/ 22 июня 2009

Эта схема уже определена и находится в производстве? Если нет, я бы настоятельно рекомендовал иметь отдельную таблицу «изменений» некоторого описания - возможно, использовать fieldname, fieldvalue, где fieldvalue - это sql_variant.

Я не думаю, что ваша существующая структура будет хорошо выглядеть, когда значения будут «приняты» (я полагаю, null), тем более что вы не сохраните историю аудита при таком подходе.

...