我有一个带有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)))
更新:为了回应评论(谢谢)并假设 B 是nvarchar(max)
列,我已经移动了CAST
里面COALESCE
尝试SELECT ISNULL(A, cast(B AS varbinary(max))) FROM TABLE
您的案例陈述评估为可怕的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)
thewhen
和 thecoalesce
都将假定第一个参数的数据类型。要将结果转换为varbinary
,您可以先放置varbinary
列,或显式转换:
COALESCE(CAST(A AS VARBINARY(MAX)),B)
这是创建表和插入值并应用我的代码并且只检索非空值的完整代码
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]')