sql—在执行查询时报告错误(将数据类型varchar转换为float时出错)

hs1ihplo  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(422)
select * from fb_lab_test 
where (report_item_code = 'HBcAb' and result like '%positive%') 
or (
    report_item_code = 'Anti-Hbc' and 
    case isnumeric(result) when 1 then cast(result as float) else 10000.0 end > 0.2
)

在这个sql中我有两个条件,当我使用其中一个时,没有错误,但是当我添加 OR ,出现错误:
将数据类型varchar转换为float时出错
有人能帮忙吗?谢谢。
这是示例数据

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE fb_lab_test(
    [id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [Test_No] [varchar](50) NULL,
    [execute_date] [datetime] NULL,
    [PatientId] [varchar](20) NULL,
    [Visit_Id] [varchar](10) NULL,
    [Patient_Type] [int] NULL,
    [PatientName] [varchar](100) NULL,
    [result_date_time] [datetime] NULL,
    [report_item_name] [varchar](256) NULL,
    [report_item_code] [varchar](50) NULL,
    [result] [varchar](100) NULL
) ON [PRIMARY]
GO

INSERT INTO fb_lab_test values('5910315197','2019-10-31 00:40:53.000','111111','1','1','Tom','2019-10-31 08:56:54.000','test1','KET','-')
92dk7w1h

92dk7w1h1#

sql server使用转换值的表达式会非常有趣。即使它看起来应该被过滤掉,有时查询处理器仍然会计算这些值。有时您可以通过稍微更改查询来绕过它。
尝试。。。

select * from fb_lab_test where (report_item_code = 'HBcAb' and result like '%positive%')
union 
select * from fb_lab_test where report_item_code = 'Anti-Hbc' and 
    case isnumeric(result) when 1 then cast(result as float) else 10000.0 end > 0.2
uinbv5nw

uinbv5nw2#

如果您使用的是受支持的sql server版本,则不要使用 isnumeric() ! 避免 case 中的表达式 where 条款。我想你想要:

select *
from fb_lab_test
where (report_item_code = 'HBcAb' and result like '%positive%') or
      (report_item_code = 'Anti-Hbc' and 
       (try_cast(result as float) > 0.2 or try_cast(result as float) is null)
      );
wj8zmpe1

wj8zmpe13#

在查询中,result列与like运算符一起使用,like运算符的值作为varchar进行比较。

result like '%positive%'

在最后一个条件中,您将结果强制转换为float,这将产生错误。
如果结果是5,它将被强制转换。如果结果是'xyz',它将不会被强制转换。

falq053o

falq053o4#

如果没有错误,当你使用他们中的任何一个。所以您可以通过下面的查询语句进行处理:

SELECT * FROM fb_lab_test 
WHERE 1=1 
AND report_item_code = 'HBcAb' 
AND result LIKE '%positive%'

UNION ALL

SELECT * FROM fb_lab_test 
WHERE 1=1
AND report_item_code = 'Anti-Hbc' 
AND CASE ISNUMBERIC(result) WHEN 1 THEN CAST(result AS float) ELSE 10000.0 END > 0.2

相关问题