【问题标题】:Using NULLIF or Coalesce in CTE - Data type conversion error在 CTE 中使用 NULLIF 或 Coalesce - 数据类型转换错误
【发布时间】:2019-01-19 03:38:14
【问题描述】:

我在视图中有以下 CTE,我想添加一些 NULLIF(或等效)函数,以便如果 WTHD_BOX16NULL 然后替换为空字符串(空白),否则显示该值。

WITH VWDETAIL  AS 
( SELECT VENDOR_ID , 'PA/13679089' AS WTHD_BOX17 , WTHD_BASIS_AMT AS WTHD_BOX18 , YEAR(PYMNT_DT) AS YEAR , 
  CASE WHEN PYMNT_DT <= '01/31/2014' THEN '1099' ELSE 'NGC' END AS WTHD_CNTL_ID 
  FROM PS_WTHD_TRXN_TBL A 
  WHERE WTHD_CLASS IN ('01','02','07') 
   AND BUSINESS_UNIT IN ('10000','50000') 
   AND PYMNT_DT <= CASE BUSINESS_UNIT WHEN '10000' THEN '01/31/2014' ELSE '12/31/2018'  END)

  , BOX16DATA AS

 ( SELECT --A.BUSINESS_UNIT, A.VOUCHER_ID, 
A.PYMNT_TYPE, SUM(A.PAID_AMT) AS BOX16PAIDAMT, SUM(A.PYMNT_GROSS_AMT) AS WTHD_BOX16, B.VENDOR_ID, YEAR(A.SCHEDULED_PAY_DT) AS 'Year'
FROM PS_PYMNT_VCHR_XREF A
INNER JOIN PS_VOUCHER B ON B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.VOUCHER_ID = A.VOUCHER_ID
WHERE PYMNT_TYPE = 'W'
AND REMIT_VENDOR = '47860A'
GROUP BY B.VENDOR_ID,  A.PYMNT_TYPE, YEAR(A.SCHEDULED_PAY_DT)
) 

SELECT A.VENDOR_ID, B.WTHD_BOX16,  WTHD_BOX17 , SUM(WTHD_BOX18) AS WTHD_BOX18 , YEAR , WTHD_CNTL_ID  
FROM VWDETAIL A
LEFT OUTER JOIN BOX16DATA B ON B.VENDOR_ID = A.VENDOR_ID AND B.Year = YEAR
GROUP BY A.VENDOR_ID , WTHD_BOX17 , YEAR , WTHD_CNTL_ID, B.WTHD_BOX16
ORDER BY A.YEAR
GO

我将NULLIF 添加到最终的Select 语句中,但是我得到了错误“将数据类型varchar 转换为数字时出错”。

SELECT A.VENDOR_ID, NULLIF(B.WTHD_BOX16, ''),  WTHD_BOX17 , SUM(WTHD_BOX18) AS WTHD_BOX18 , YEAR , WTHD_CNTL_ID  
FROM VWDETAIL A
LEFT OUTER JOIN BOX16DATA B ON B.VENDOR_ID = A.VENDOR_ID AND B.Year = YEAR
GROUP BY A.VENDOR_ID , WTHD_BOX17 , YEAR , WTHD_CNTL_ID, B.WTHD_BOX16
ORDER BY A.YEAR
GO

如何解决这个问题,以便在没有 NULL 和 NULL 行的空字符串的情况下获得数值?使用 MS SQL Server。

【问题讨论】:

  • 如果列是数字,您可能需要 0。请改用NULLIF(B.WTHD_BOX16, 0)COALESCE(B.WTHD_BOX16,0)
  • 如果返回为NULL,我宁愿有一个空白(空字符串)
  • 你不能有一个空字符串——它不是一个字符串!
  • ISNULL(CAST(B.WTHD_BOX16 AS VARCHAR(50)), '') AS WTHD_BOX16 似乎在最终的 Select 查询中起作用。
  • 好的,这会改变您的选择返回的类型...调用应用程序有效吗?

标签: sql sql-server-2014


【解决方案1】:

您可以将列转换为 varchar,例如演员(col as varchar(50))。空白无法转换为数字。

【讨论】:

  • 例如isnull(cast(SUM(A.PYMNT_GROSS_AMT) as varchar(50)),'') AS WTHD_BOX16
  • 这在我运行整个查询时不起作用。我仍然在 WTHD_BOX16 列中获得 NULL 值...
  • 在最后一个 select 语句中使用强制转换,例如SELECT A.VENDOR_ID, isnull(cast(B.WTHD_BOX16 as varchar(50),''), WTHD_BOX17 , SUM(WTHD_BOX18) AS WTHD_BOX18 , YEAR , WTHD_CNTL_ID
  • ISNULL(CAST(B.WTHD_BOX16 AS VARCHAR(50)), '') AS WTHD_BOX16 似乎有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
相关资源
最近更新 更多