2010-10-21 5 views
2

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

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

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

COALESCE - это то, что вам нужно. http://msdn.microsoft.com/en-us/library/aa258244(SQL.80).aspx –

ответ

5
SELECT COALESCE(A, CAST(B As varbinary(max))) 

UPDATE: В ответ на замечания (спасибо) и предполагающей B является nvarchar(max) колонка, я переехал CAST в случае заявления о COALESCE

+0

Если 'A' является столбцом' nvarchar (max) ', это приведет к двойному преобразованию для B. I.e. от 'varbinary' до' nvarchar', чтобы соответствовать первому аргументу 'coalesce', а затем снова для явного литья – Andomar

+0

@Andomar - неважно, в каком порядке находятся столбцы. COALESCE выбирает« лучший »тип данных из всех доступных. ISNULL использует первый тип данных. –

+0

@Damien_The_Unbeliever: Вы правы, хотя вы все равно получите двойное преобразование. (Похоже, что 'nvarchar' имеет более высокий приоритет, чем' varbinary', http://msdn.microsoft.com/en-us/library/ms190309.aspx) – Andomar

2

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

1

Ваш оценивает в страшном 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 будут как sume - тип данных первого аргумента. Для того, чтобы привести результат к varbinary, вы можете разместить varbinary столбец первой, или явно отливать:

COALESCE(CAST(A AS VARBINARY(MAX)),B) 
+0

От BOL for COALESCE «Возвращает тип данных выражения с наивысшим приоритетом типа данных». В то время как ISNULL «Возвращает тот же тип, что и check_expression». (где check_expression является первым аргументом) –

+0

Кроме того, CASE: «Возвращает наивысший тип приоритета из набора типов в result_expressions и необязательное else_result_expression» –

0

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

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 <[email protected] 
begin 

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

    --set @statment = 'select '[email protected]+' 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 '[email protected]+' from [dbo].[SUPPLIER]')