Ошибка преобразования varchar в тип данных INT

Я продолжаю получать ошибку:

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

Столбец Sales из Table3 определяется как varchar(20) null.

Обратите внимание, что столбец «Продажи» включает значения varchar, такие как «Не найдено» или пустое пространство «», а также десятичные значения, такие как «789,08». Я никогда не видел этого раньше. Мне определенно нужна чья-то поддержка.

SELECT DISTINCT
    a.AccountNumber, 
    a.LocationNum,
    b.DateSubmitted,
    CAST (replace(d.Sales, ',', '') AS int) AS 'Sales', 
    d.Description
FROM
    Table1 a 
INNER JOIN
    Table2 b ON a.AccountNumber = b.AccountNumber
INNER JOIN
    Table3 d ON d.AccountNumber = b.AccountNumber

тег с платформой базы данных

OldProgrammer 21.06.2024 21:49

Вы пытаетесь преобразовать 789,08 в целое число, что, очевидно, не сработает, вам нужно будет преобразовать его в десятичное число.

NickW 21.06.2024 21:51

как удалить десятичную дробь и преобразовать в целое число?

Kkoruni 21.06.2024 22:09

Какую платформу базы данных вы используете? Сообщение об ошибке похоже на SQL Server? Кроме того, каковы ваши желаемые результаты для строк со значениями, которые не являются допустимыми целыми числами? например «Не найдено» или пустое место «», а также десятичные значения, например «789,08».

Martin Smith 21.06.2024 22:12

я использую SQL. результат таких действий, как «Не найдено» или «пустое пространство», я хочу, чтобы возвращаемое значение было равно нулю (0) в числовом виде, а десятичное значение удалено и возвращаемое значение было 789.

Kkoruni 21.06.2024 22:15

Вероятно, вам придется использовать оператор CASE, а затем обрабатывать каждый тип данных в столбце в своем собственном операторе.

NickW 21.06.2024 22:18

«Я использую SQL» — однако это бывает во многих вариантах, каждый из которых имеет разные возможности. Так какую СУБД вы на самом деле используете? SqlServer, Oracle, MySql, Sqlite,...? Пожалуйста, добавьте правильный тег

Hans Kesting 21.06.2024 22:35

Вы используете «SQL Server» от Microsoft?

Schwern 21.06.2024 22:41

Как использовать десятичный оператор в случае, когда операторы?

Kkoruni 21.06.2024 22:42

да, я использую SSMS v20.

Kkoruni 21.06.2024 22:43

«Как мне использовать десятичный оператор в случае, если операторы?» Итак, изучив утверждения CASE, что вы на самом деле пробовали?

NickW 21.06.2024 23:07

попробуйте забросить/конвертировать в деньги... это немного проще. Например, try_convert(money,'1,708.52'). Затем при необходимости вы можете преобразовать в int.

John Cappelletti 22.06.2024 01:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
12
84
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам следует предоставить дополнительную информацию о столбце продаж. Если столбец продаж ожидает десятичное значение, вам нужно преобразовать d.Sales из varchar в десятичное, а не в int. Кроме того, если в столбце продаж указано целое число, вы не сможете преобразовать 789,08 в целое число:

select Distinct
    a.AccountNumber, 
    a.LocationNum,
    b.DateSubmitted,
    TRY_CAST(replace(d.Sales, ',', '') AS decimal(10, 2)) as 'Sales', 
d.Description
from Table1 a 
inner join Table2 b on a.AccountNumber = b.AccountNumber
inner join Table3 d on d.AccountNumber = b.AccountNumber

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

Объяснение сделало бы этот ответ лучшим.

Schwern 21.06.2024 21:52

Я попробовал предложенное десятичное число, как показано, но получил эту ошибку: (Ошибка преобразования типа данных varchar в числовой.) Обратите внимание, что данные включают сохраненные значения, такие как (Не найдено).

Kkoruni 21.06.2024 22:05

@Kkoruni, тебе нужен try_cast, проверь ответ еще раз

VicenteC 21.06.2024 22:14

Привет Дейл и Висенте! Благодарим вас за рекомендации по функции try_cast. Я внес изменения в свой запрос и создал временную таблицу для получения результатов в формате varchar, а затем использовал функцию try_cast. Теперь у меня есть результаты в нужном мне формате. Спасибо вам и всем в этом посте за помощь в этом вопросе.

Kkoruni 24.06.2024 18:31

@Kkoruni, ты можешь пометить это (или ответ, который помог тебе решить проблему) как ответ на вопрос

VicenteC 24.06.2024 22:23
Ответ принят как подходящий

Целые числа — это целые числа, такие как 1, -1, 42 и 789. Они хранятся в различных целочисленных типах .

789,08 — десятичное число. Обычно существует два способа их хранения: числа с плавающей запятой или числа произвольной точности . Они хранятся в формате с плавающей запятой и в десятичном формате или numeric. У них обоих есть предостережения.

Числа с плавающей запятой могут быть неточными. Если важно, чтобы 789.08 был точно представлен, например, если это валюта, используйте decimal(10,2).


Поскольку столбец «Продажи» содержит много мусора, вам придется проделать дополнительную работу для обработки нечисловых значений. Если вы используете try_cast вместо cast, неконвертируемые значения вернутся как null.

TRY_CAST( 
  replace(d.Sales, ',', '') AS decimal(10,2)
) AS 'Sales'

Хоть убей, я не понимаю, зачем хранить что-либо в целочисленном столбце, например, varchar, пустые места или десятичные дроби. У вас есть пример, которым вы можете поделиться, как использовать числа с плавающей запятой, десятичные или числовые значения в этом SQL, который я предоставил?

Kkoruni 21.06.2024 22:07

@Kkoruni Я добавил пример использования с try_cast. В разделе «Продажи» хранился мусор, поскольку это допускал тип данных varchar(20). Чтобы избежать этого, используйте наиболее строгий и подходящий тип данных и ограничения , чтобы точно знать, что хранится в столбце. Эта проблема известна как «целостность данных». Небрежные данные все усложняют.

Schwern 21.06.2024 22:56

спасибо за руководство по функции try_cast. Я внес изменения в свой запрос и создал временную таблицу для получения результатов в формате varchar, а затем использовал функцию try_cast. Теперь у меня есть результаты в нужном мне формате.

Kkoruni 24.06.2024 18:29

@Kkoruni Рад, что это помогло. Вам не нужна временная таблица, вы сможете сделать это с помощью одного запроса.

Schwern 24.06.2024 21:04

Прежде всего, невозможно напрямую преобразовать десятичные значения в int, и любезно предоставьте дополнительную информацию о Декларации переменных.

Надеюсь, эта ссылка будет полезна Geeks4geeks SQL конвертирует Varchar в Int

Другие вопросы по теме