修复无效数据类型错误,nvarchar无效

问题描述 投票:0回答:1

我有疑问:

Select 
    Location, date, total_cases, total_deaths,        
    (total_deaths / total_cases) * 100 as DeathPercentage
From 
    PortfolioProject.dbo.CovidDeaths$
Order By 
    1, 2

但是当我运行它时出现这个错误:

消息 8117,级别 16,状态 1,第 24 行
操作数数据类型 nvarchar 对于除法运算符无效。

如何重写查询以便修复此错误?

我用过

SELECT 
    CAST(total_deaths AS Integer) 
FROM 
    PortfolioProject.dbo.CovidDeaths$


SELECT 
    CAST(total_cases AS Integer) 
FROM 
    PortfolioProject.dbo.CovidDeaths$

它返回了整数,但是当我用除法重新运行查询时,我得到了同样的错误。

sql sql-server nvarchar
1个回答
0
投票

由于错误消息告诉我们您正在尝试对 nvarchar 列进行 atitmetic,因此您需要将数据转换(或转换)为可以执行算术的内容。当您使用 SQL Server 时,我建议您使用

TRY_CAST()
,它是容错的,因为如果无法转换值,它会返回 NULL 而不是停止查询。所以,你可以这样做:

SELECT
      Location
    , [date]
    , total_cases
    , total_deaths
    , (TRY_CAST(total_deaths AS INT) / TRY_CAST(total_cases AS INT)) * 100.0 AS DeathPercentage
FROM PortfolioProject.dbo.CovidDeaths$
ORDER BY
      Location
    , [date]

更进一步,您可能需要避免被零除的错误,并且您可能还需要比整数提供的更精确的数字,所以也许:

SELECT
      Location
    , [date]
    , total_cases
    , total_deaths
    , (TRY_CAST(total_deaths AS NUMERIC(10, 2)) / NULLIF(TRY_CAST(total_cases AS NUMERIC(10, 2)), 0)) * 100.0 AS DeathPercentage
FROM PortfolioProject.dbo.CovidDeaths
ORDER BY
      Location
    , [date]

ps:“日期”不是列名的明智选择。


在评论中,您寻求有关如何“修复”nvarchar 列的帮助。这涉及几个步骤,你需要确保你有一个备份,以防它在任何时候崩溃。

-- Step 1: Create a backup copy of the table
SELECT * INTO PortfolioProject.dbo.CovidDeaths_backup
FROM PortfolioProject.dbo.CovidDeaths;

-- Step 2: Add new numeric columns to the table
ALTER TABLE PortfolioProject.dbo.CovidDeaths
ADD total_cases_numeric NUMERIC(10,2),
    total_deaths_numeric NUMERIC(10,2);

-- Step 3: Set the values of the new columns using TRY_CAST
UPDATE PortfolioProject.dbo.CovidDeaths
SET total_cases_numeric = TRY_CAST(total_cases AS NUMERIC(10,2)),
    total_deaths_numeric = TRY_CAST(total_deaths AS NUMERIC(10,2));


-- WARNING you may want to stop at this point! Inspect the new columns before proceeding

-- Step 4: OPTIONAL! Drop the original nvarchar columns
ALTER TABLE PortfolioProject.dbo.CovidDeaths
DROP COLUMN total_cases,
            total_deaths;

-- Step 5: OPTIONAL! Rename the new numeric columns to the original names
EXEC sp_rename 'PortfolioProject.dbo.CovidDeaths.total_cases_numeric', 'total_cases', 'COLUMN';
EXEC sp_rename 'PortfolioProject.dbo.CovidDeaths.total_deaths_numeric', 'total_deaths', 'COLUMN';

如果您对此感到不舒服,请不要这样做。

nb:自始至终我都使用数字(10,2)这是一个猜测,你可以调整它以适应,或者如果你需要的话只使用整数。

© www.soinside.com 2019 - 2024. All rights reserved.