2010-10-21 105 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 – 2010-10-21 12:37:59

回答

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

UPDATE:針對評論(感謝),並假設B是nvarchar(max)列,我已經感動在COALESCE

+0

如果'A'是'nvarchar(max)'列,這將導致B的雙重轉換。從'varbinary'到'nvarchar'將第一個參數匹配到'coalesce',然後再次返回以進行明確的轉換 – Andomar 2010-10-21 12:47:59

+0

@Andomar - 列的順序無關緊要。COALESCE選擇「最佳」數據類型從所有可用。 ISNULL使用第一種數據類型。 – 2010-10-21 12:52:41

+0

@Damien_The_Unbeliever:你說得對,雖然你仍然會得到雙重轉換。 (看起來'nvarchar'優先於'varbinary',http://msdn.microsoft.com/en-us/library/ms190309.aspx) – Andomar 2010-10-21 12:57:49

2

嘗試SELECT ISNULL(A, cast(B AS varbinary(max))) FROM TABLE

1

你的case語句裏面的CAST計算結果爲可怕的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和​​3210將作爲sume第一個參數的數據類型。爲了把結果給varbinary,可以先放置varbinary列或顯式轉換:

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

從BOL for COALESCE「返回具有最高數據類型優先級的表達式的數據類型」。而ISNULL「返回與check_expression相同的類型」。 (其中check_expression是第一個參數) – 2010-10-21 12:55:29

+0

另外,CASE:「返回result_expression中的一組類型中的最高優先級類型和可選的else_result_expression」 – 2010-10-21 12:58:40

0

這裏是創建表並插入值,並應用我的代碼,只檢索NOT NULL值

的完整代碼
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]')