Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将数据类型varchar转换为数字时出错。当尝试比较数值_Sql_Sql Server - Fatal编程技术网

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

Sql 将数据类型varchar转换为数字时出错。当尝试比较数值,sql,sql-server,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

我在尝试执行下面的查询时出错。如果有人能解决这个问题,我们将不胜感激

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
最好的长期解决方案是不要在同一列中混合文本和数字数据。我不知道为什么这个答案被否决了,因为它是回答原始问题的工作代码

输出:

此处演示:


一列只能是一种类型

不能将两种类型“NUMERIC”和“varchar(30)”放在一列中

最好的方法是将其转换为一种类型。看来varchar(30岁)是一个更好的选择

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

我认为这不是OP想要的,因为没有一个数字数据匹配:。