Выбор ненулевого столбца - PullRequest
2 голосов
/ 21 октября 2010

У меня есть таблица со столбцом varbinary(max) и столбцом nvarchar(max). Один из них имеет значение null, а другой имеет значение.

Я хотел бы вернуть столбец со значением в виде столбца varbinary (max). Пока я пробовал это, это не работает:

SELECT 
      A =  
      CASE A
         WHEN NULL THEN B
         ELSE A 
      END
FROM Table

Ответы [ 4 ]

5 голосов
/ 21 октября 2010
SELECT COALESCE(A, CAST(B As varbinary(max)))

ОБНОВЛЕНИЕ : В ответ на комментарии (спасибо) и предполагая, что B является столбцом nvarchar(max), я переместил CAST в COALESCE

2 голосов
/ 21 октября 2010

Попробуйте SELECT ISNULL(A, cast(B AS varbinary(max))) FROM TABLE

1 голос
/ 21 октября 2010

Ваша выписка по делу оценивается до страшного A = NULL:

CASE A WHEN NULL THEN B ELSE A END

Так же, как:

CASE WHEN A = NULL then B ELSE A END

Один из способов исправить это - использовать A IS NULL, например:

CASE WHEN A IS NULL THEN B ELSE A END

Или даже проще:

COALESCE(A,B)

И when, и coalesce примут тип данных первого аргумента. Чтобы привести результат к varbinary, вы можете сначала поместить столбец varbinary или явное приведение:

COALESCE(CAST(A AS VARBINARY(MAX)),B)
0 голосов
/ 04 декабря 2012

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

CREATE TABLE [dbo].[SUPPLIER](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SUPPLIER_NAME] [varchar](100) NOT NULL,
    [ADDRESS] [varchar](150) NULL,
    [CREATE_DATE] [datetime] NULL,)

    INSERT INTO [MyPayrol].[dbo].[SUPPLIER]
           ([SUPPLIER_NAME]           
           ,[CREATE_DATE])
     VALUES
           ('Khaled Nabil'
           ,GETDATE())


declare @inumberofcolumn int

select @inumberofcolumn= count(*) 
from sys.columns where OBJECT_NAME(object_id) = 'supplier'

declare @nameofcolumn varchar(100)

set @nameofcolumn =''

declare @counter int

set @counter=1


declare @colname varchar(100)

declare @statment varchar(100)

declare @value varchar(100)

while @counter <=@inumberofcolumn
begin

    select @colname= COL_NAME(object_id('[dbo].[SUPPLIER]'),@counter)
    declare @data table ([value] varchar(100))

    --set @statment = 'select '+@colname+' from [dbo].[SUPPLIER]'
      insert @data exec ('SELECT top 1 '+ @colname +' from [dbo].[SUPPLIER]') 
      select @value = [value] from @data
    if @value is not  null
    begin
        if @counter = 1
        begin   
            set @nameofcolumn = @nameofcolumn + @colname
        end
        else
        begin
            set @nameofcolumn = @nameofcolumn + ','+ @colname
        end
    end
    set  @counter = @counter+1
end



execute ('select '+@nameofcolumn+' from [dbo].[SUPPLIER]')
...