我有一個表varbinary(max)
列和nvarchar(max)
列。其中一個是空的,另一個是有價值的。選擇非空欄
我想返回值作爲varbinary(max)列的列。到目前爲止,我已經試過了,還是不行:
SELECT
A =
CASE A
WHEN NULL THEN B
ELSE A
END
FROM Table
我有一個表varbinary(max)
列和nvarchar(max)
列。其中一個是空的,另一個是有價值的。選擇非空欄
我想返回值作爲varbinary(max)列的列。到目前爲止,我已經試過了,還是不行:
SELECT
A =
CASE A
WHEN NULL THEN B
ELSE A
END
FROM Table
SELECT COALESCE(A, CAST(B As varbinary(max)))
UPDATE:針對評論(感謝),並假設B是nvarchar(max)
列,我已經感動在COALESCE
如果'A'是'nvarchar(max)'列,這將導致B的雙重轉換。從'varbinary'到'nvarchar'將第一個參數匹配到'coalesce',然後再次返回以進行明確的轉換 – Andomar 2010-10-21 12:47:59
@Andomar - 列的順序無關緊要。COALESCE選擇「最佳」數據類型從所有可用。 ISNULL使用第一種數據類型。 – 2010-10-21 12:52:41
@Damien_The_Unbeliever:你說得對,雖然你仍然會得到雙重轉換。 (看起來'nvarchar'優先於'varbinary',http://msdn.microsoft.com/en-us/library/ms190309.aspx) – Andomar 2010-10-21 12:57:49
嘗試SELECT ISNULL(A, cast(B AS varbinary(max))) FROM TABLE
你的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)
從BOL for COALESCE「返回具有最高數據類型優先級的表達式的數據類型」。而ISNULL「返回與check_expression相同的類型」。 (其中check_expression是第一個參數) – 2010-10-21 12:55:29
另外,CASE:「返回result_expression中的一組類型中的最高優先級類型和可選的else_result_expression」 – 2010-10-21 12:58:40
這裏是創建表並插入值,並應用我的代碼,只檢索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]')
COALESCE是你需要的。 http://msdn.microsoft.com/en-us/library/aa258244(SQL.80).aspx – 2010-10-21 12:37:59