sql - 将数据类型 varchar 转换为数字时出错。当尝试比较数字时

标签 sql sql-server

当我尝试执行以下查询时出现错误。任何人都可以解决这个问题,我们将不胜感激。

DECLARE @TABLE TABLE(ID INT,CATEGORY VARCHAR(30),VALUE VARCHAR(30))
INSERT INTO @TABLE
SELECT 1,'A','5'
UNION ALL 
SELECT 2,'B','6'
UNION ALL
SELECT 3,'C','VAL'
UNION ALL
SELECT 4,'D','HSD'

DECLARE @TABLE1 TABLE(ID INT,CATEGORY VARCHAR(30),VALUE VARCHAR(30))
INSERT INTO @TABLE1
SELECT 1,'A','5.0'
UNION ALL 
SELECT 2,'B','6.0'
UNION ALL
SELECT 3,'C','VAL'
UNION ALL
SELECT 4,'D','HSD'

SELECT
    A.ID,
    A.CATEGORY,
    A.VALUE
FROM @TABLE A, @TABLE1 B
WHERE
    CASE ISNUMERIC(A.VALUE) WHEN 1 THEN CAST (A.VALUE AS NUMERIC)
                                   ELSE A.VALUE END=CASE ISNUMERIC(B.VALUE) WHEN 1
                                   THEN CAST (B.VALUE AS NUMERIC) ELSE B.VALUE END

最佳答案

我相信您收到的错误是由于 WHERE 子句中的 CASE 表达式具有不同类型的分支(即文本和数字)引起的。要解决此问题,您需要使所有分支具有相同的类型。由于文本的原因,将所有内容都设为数字是行不通的,但我们可以将所有内容设为文本。

对于数值数据,您甚至没有相同类型的数据。为了解决这个问题,您可以将数字数据转换为常见的十进制格式,然后再转换回文本:

WHERE
    CASE WHEN ISNUMERIC(A.VALUE) = 1
         THEN CONVERT(VARCHAR, CAST(A.VALUE AS DECIMAL(10,2)))
         ELSE A.VALUE END =
    CASE WHEN ISNUMERIC(B.VALUE) = 1
         THEN CONVERT(VARCHAR, CAST(B.VALUE AS DECIMAL(10,2)))
         ELSE B.VALUE END

对您来说,最好的长期解决方案是不要在同一列中混合文本和数字数据。我不知道为什么这个答案被否决,因为它是回答原始问题的工作代码。

输出:

enter image description here

此处演示:

Rextester

关于sql - 将数据类型 varchar 转换为数字时出错。当尝试比较数字时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45809633/

相关文章:

sql - 如何使用一个 select 语句的结果作为另一个 select 语句的列?

sql-server - SQL 更新语句的双重结果

sql - 更改多个表的列长度

mysql - SQL 选择表中所有具有与 '..' 相同 ID 的表

mysql - 在mysql数据库中创建角色

c# - 另一个进程正在使用数据库...但是什么进程?

请求 SQL 帮助 : SELECT Table A Joined with Table B (Max or Null)

mysql - 按日期选择最高/最大总和组

mysql - SQL "BETWEEN"请求不按我的意愿行事

sql - 在 WHERE 子句中引用列别名