Sql 在比较两列时,是否有方法将Case函数与nvarchar数据类型一起使用?

Sql 在比较两列时,是否有方法将Case函数与nvarchar数据类型一起使用?,sql,sql-server,Sql,Sql Server,我试图检索满足案例条件的值,条件是 如果tr.valuetr.PanicMax然后返回tr.value时的情况 但是我得到一个错误,说“将数据类型nvarchar转换为数值时出错”,因为三列tr.panicMin、tr.PanicMax、tr.value中的值不是数值, 添加case函数之前使用的原始查询是: SELECT SP.Specialisation, TSP.SpecimenName,T.Name as Test_Name,TR.Value,TR.PanicMin ,tr.PanicM

我试图检索满足案例条件的值,条件是

如果tr.value 当tr.value>tr.PanicMax然后返回tr.value时的情况

但是我得到一个错误,说“将数据类型nvarchar转换为数值时出错”,因为三列tr.panicMin、tr.PanicMax、tr.value中的值不是数值, 添加case函数之前使用的原始查询是:

SELECT SP.Specialisation, TSP.SpecimenName,T.Name as Test_Name,TR.Value,TR.PanicMin ,tr.PanicMax , PA.RegCode AS UHID, TT.DoneAt AS COL_DATE, TT1.DoneAt AS ACK_DATE, TT2.DoneAt AS VER_DATE, TT2.DoneBy,
(CAST((DATEDIFF(minute, TT1.DoneAt, TT2.DoneAt))/60 AS VARCHAR)+' H:'                                 
+ CAST((DATEDIFF(minute,TT1.DoneAt,TT2.DoneAt))%60 AS VARCHAR)+' M') AS TAT,
(CASE WHEN TOI.TestID IN (2160, 2878, 956, 1000, 1002, 932, 934) AND ((DATEDIFF(minute, TT1.DoneAt, TT2.DoneAt)) > 60) THEN 'WITHOUT TAT'
WHEN TOI.TestID IN (991, 941, 942, 943, 2396) AND ((DATEDIFF(minute, TT1.DoneAt, TT2.DoneAt)) > 15) THEN 'WITHOUT TAT'
WHEN TT2.DoneAt IS NULL THEN NULL
ELSE 'WITHIN TAT' END) AS TAT_STAT 
FROM v_dbNxGtestorderitems TOI
INNER JOIN V_TestSpecimen TSP ON TSP.TestID = TOI.TestID
INNER JOIN v_dbNxgtestorders TSO ON TSO.TestOrderID = TOI.TestOrderID AND TSO.OrderTypeID = 15
INNER JOIN v_dbSpecializations SP ON SP.SpecialiseID = TOI.SpecialiseID
INNER JOIN v_dbPatientAdmissions PA ON PA.AdmissionID = TOI.AdmissionID
  join v_dbtestresults tr on tr.TestOrderID=TOI.TestOrderID
  join v_Tests t on t.TestId=tr.TestID
  join v_dbTestComponents tc on tc.TestID=tr.TestID
  join v_dbComponents c on c.ComponentID=tr.ComponentID
CROSS apply   (select top 1  TestOrderID, TestOrderItemID, DoneAt  from  v_dbtesttasks
where TestOrderID=toi.TestOrderID and    TestOrderItemID=toi.TestOrderItemID and taskStatusid=3
Order  by DoneAt desc  )  tt
CROSS apply   (select top 1  TestOrderID, TestOrderItemID, DoneAt  from  v_dbtesttasks
where TestOrderID=toi.TestOrderID and    TestOrderItemID=toi.TestOrderItemID and taskStatusid=4
Order  by DoneAt desc  )  tt1
outer  apply   (select top 1  TestOrderID, TestOrderItemID, DoneAt, SD.Name AS DoneBy from  v_dbtesttasks TTS
INNER JOIN v_dbSecurityIds SD ON SD.SID = TTS.DoneBy
where TestOrderID=toi.TestOrderID and    TestOrderItemID=toi.TestOrderItemID and taskStatusid=8
order  by DoneAt desc  )  tt2
WHERE TOI.TestID in (932, 934, 941, 942, 943, 991, 1000, 1002, 2396, 2878, 2160) AND TSO.OrderDate > '2019-01-01' AND TSO.OrderDate < DATEADD(DAY, 1, '2019-01-10') 
查询输出为

您可以尝试将带有浮点数字内容的字符串转换为TRAS

 convert(float,'9.0')
就你而言

convert(float, tr.PanicMin) 

您可以尝试将带有数字内容的字符串转换为浮点数

 convert(float,'9.0')
就你而言

convert(float, tr.PanicMin) 

在SQL Server 2012及更高版本中,您可以使用:

CASE WHEN TRY_CONVERT(float, tr.value) < TRY_CONVERT(float, tr.PanicMin)
       OR TRY_CONVERT(float, tr.value) > TRY_CONVERT(float, tr.PanicMax)
  THEN tr.value END

在SQL Server 2012及更高版本中,您可以使用:

CASE WHEN TRY_CONVERT(float, tr.value) < TRY_CONVERT(float, tr.PanicMin)
       OR TRY_CONVERT(float, tr.value) > TRY_CONVERT(float, tr.PanicMax)
  THEN tr.value END

为什么不使用CAST函数呢?最好的解决方案是不要将数字数据存储在nvarchar列中。我使用CAST函数对numeric和nvarchar进行转换,但仍然得到相同的错误SQL Server的哪个版本?请始终包含此信息。您可以始终尝试ISNUMERIC查看这些列中哪些值不是数字。一旦你知道问题值是什么,你就可以解决它们,或者为什么要把它们放在那里。为什么不使用CAST函数呢?最好的解决办法是不要将数字数据存储在nvarchar列中。我使用CAST函数对numeric和nvarchar进行转换,但仍然得到相同的错误。什么版本的SQL Server?请始终包含此信息。您可以始终尝试ISNUMERIC查看这些列中哪些值不是数字。一旦你知道问题值是什么,你就可以首先解决它们或者为什么要把它们放在那里。