2015-11-20 6 views
1

У меня есть два столбца в таблице SQL, как показано ниже. Мне нужно сравнить эти два столбца для несоответствий, но из-за дополнительных десятичных знаков я получаю ложные результаты. Когда я пытаюсь преобразовать первый столбец, он дает ошибкуSQL Server: сравнение двух столбцов

«Ошибка преобразования типа данных varchar в числовой».

Как решить эту проблему? Длина первого столбца меняется.

Column01(varchar) Column02(Decimal) 
0.01    0.010000 
0.255    0.255000 
+0

Какие СУБД вы фактически используете? SQL Server 2008 или SQL Server 2012? Пометьте свой вопрос соответствующим образом. – Siyual

ответ

5

У вас есть данные в Column01, которые не могут быть отлиты в DECIMAL.

С SQL Server 2012+ Я хотел бы использовать TRY_PARSE:

SELECT * 
FROM your_table 
WHERE Column02 = TRY_PARSE(Column01 AS DECIMAL(38,18)); 

LiveDemo

Когда значение из колонки не могут быть литыми безопасно вы получите NULL.

Для SQL Server 2008 вы можете использовать:

SELECT * 
FROM #tab 
WHERE (CASE 
      WHEN ISNUMERIC(Column01) = 1 THEN CAST(Column01 AS DECIMAL(38,18)) 
      ELSE NULL 
     END) = Column02; 

EDIT:

Если вам это нужно при использовании на уровне столбцов:

SELECT Column01, Column02, 
    CASE WHEN Column02 = TRY_PARSE(Column01 AS DECIMAL(38,18)) 
      OR (Column02 IS NULL AND Column01 IS NULL) 
     THEN 'true' 
     ELSE 'false' 
    END AS [IsEqual] 
FROM #tab; 

LiveDemo2

+1

Это сработало, спасибо за помощь –

1

Вы можете сделать это с помощью автообъединение и функции

SELECT x.Column01, y.Column02 
FROM table1 x, table1 y 
WHERE x.Column02 = try_parse(y.Column01 as decimal(38,18)) 

преобразования Поскольку я не могу комментировать, я хотел бы поблагодарить lad2025 за показ демо и введение в data.stackexchange для слагающих запросов

0

One другой способ сделать это:

create table #temp(col1 varchar(10),col2 decimal(10,6)) 
insert into #temp values(0.01,0.010000),(0.255,0.255000),(0.25,25),(0.555,10.0) 
select * from #temp where REPLACE(REPLACE(col2,col1,''),0,'') = '' 
select * from #temp where REPLACE(REPLACE(col2,col1,''),0,'') <> '' 
Смежные вопросы