Сообщить об ошибке (Ошибка преобразования типа данных varchar в float), когда я выполнял запрос - PullRequest
0 голосов
/ 03 августа 2020
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, появляется ошибка:

Error преобразование типа данных 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','-')

Ответы [ 4 ]

0 голосов
/ 03 августа 2020

Если вы используете поддерживаемую версию 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)
      );
0 голосов
/ 03 августа 2020

SQL Сервер может быть довольно забавным с выражениями, конвертирующими значения. Даже если кажется, что должен быть отфильтрован, иногда обработчик запросов все равно оценивает значения. Иногда это можно обойти, немного изменив запрос.

Попробуйте ...

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
0 голосов
/ 03 августа 2020

Если при использовании любого из них ошибок не было. Таким образом, вы можете справиться с этим с помощью оператора запроса, как показано ниже:

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
0 голосов
/ 03 августа 2020

В вашем запросе столбец результата использовался с оператором Like со значением для сравнения как varchar.

result like '%positive%'

В последнем условии вы приводите результат к типу float, который является выдача ошибки.

Если результат 5, он будет приведен. Если результатом является 'xyz', он не будет приведен.

...