Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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 如何将子查询的输出转换为数字_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 如何将子查询的输出转换为数字

Sql 如何将子查询的输出转换为数字,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是我的sql查询,其中我使用子查询访问所选字段 在此子查询中,返回 select rptName from RptTable where rpt_id in ( select LEFT(Reports, NULLIF(LEN(Reports)-1,-1)) from repoAccess1 where uid = 'VIKRAM' ) 返回 1,2 这意味着查询应该是 select LEFT(Reports, NULLIF(LEN(Reports

这是我的sql查询,其中我使用子查询访问所选字段

在此子查询中,返回

select rptName 
from RptTable 
where rpt_id in (
    select LEFT(Reports,    NULLIF(LEN(Reports)-1,-1))  
    from repoAccess1 
    where uid = 'VIKRAM'
)
返回 1,2

这意味着查询应该是

select LEFT(Reports,    NULLIF(LEN(Reports)-1,-1))  
from repoAccess1 
where uid = 'VIKRAM'
但我得到了这个错误

select rptName 
from RptTable where rpt_id in (1,2)

有谁能告诉我如何修改以获得精确的ans吗?没有具体的表定义,有点难说,但我很确定您正在尝试比较不同的数据类型。如果是这种情况,您可以利用,例如:

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to numeric.
更新:因为您已经更新了问题:返回
varchar
nvarchar
数据类型的结果。因此,生成的查询将是

SELECT 
    [rptName]
FROM [RptTable]
WHERE [rpt_id] IN
                 (
                  SELECT 
                      CONVERT(int, LEFT([Reports], NULLIF(LEN([Reports]) - 1, -1)))
                  FROM [repoAccess1]
                  WHERE [uid] = 'VIKRAM'
                 )

请注意值周围的撇号(这是正确的术语吗?)。由于
[rpt_id]
似乎属于数据类型
int
,因此无法隐式转换这些值。这就是前面提到的
CAST
CONVERT
发挥作用的地方。

如果没有具体的表定义,就有点难说,但我很确定您正在尝试比较不同的数据类型。如果是这种情况,您可以利用,例如:

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to numeric.
更新:因为您已经更新了问题:返回
varchar
nvarchar
数据类型的结果。因此,生成的查询将是

SELECT 
    [rptName]
FROM [RptTable]
WHERE [rpt_id] IN
                 (
                  SELECT 
                      CONVERT(int, LEFT([Reports], NULLIF(LEN([Reports]) - 1, -1)))
                  FROM [repoAccess1]
                  WHERE [uid] = 'VIKRAM'
                 )

请注意值周围的撇号(这是正确的术语吗?)。由于
[rpt_id]
似乎属于数据类型
int
,因此无法隐式转换这些值。这就是前面提到的
CAST
CONVERT
发挥作用的地方。

如果我理解正确,子查询将返回一行值为
'1,2'
。这不是一个数字,因此存在错误

在继续之前,让我强调以逗号分隔的字符串存储值不是SQL的工作方式。每个id应该有一行,并定义适当的类型和外键

也就是说,有时候我们会被其他人糟糕的设计决策所困扰。如果是这种情况,您可以像一样使用

SELECT 
    [rptName]
FROM [RptTable]
WHERE [rpt_id] IN('1', '2')

如果我理解正确,子查询将返回一行,其值为
'1,2'
。这不是一个数字,因此存在错误

在继续之前,让我强调以逗号分隔的字符串存储值不是SQL的工作方式。每个id应该有一行,并定义适当的类型和外键

也就是说,有时候我们会被其他人糟糕的设计决策所困扰。如果是这种情况,您可以像
一样使用

SELECT 
    [rptName]
FROM [RptTable]
WHERE [rpt_id] IN('1', '2')

(左(Reports,NULLIF(LEN(Reports)-1,-1))
返回1或2时,查询将正常工作,因为SQL Server会隐式地将varchar值转换为数值

看来可能有数据问题。LEFT函数返回的数据之一是非数字的。为了找到特定的记录,可以使用isnumeric函数。试着这样,

select rptName 
from RptTable 
where rpt_id in (
    select CAST(LEFT(Reports, NULLIF(LEN(Reports)-1,-1)) AS INT) as Val
    from repoAccess1 
    where uid = 'VIKRAM'
)

(左(Reports,NULLIF(LEN(Reports)-1,-1))
返回1或2时,查询将正常工作,因为SQL Server会隐式地将varchar值转换为数值

看来可能有数据问题。LEFT函数返回的数据之一是非数字的。为了找到特定的记录,可以使用isnumeric函数。试着这样,

select rptName 
from RptTable 
where rpt_id in (
    select CAST(LEFT(Reports, NULLIF(LEN(Reports)-1,-1)) AS INT) as Val
    from repoAccess1 
    where uid = 'VIKRAM'
)

您使用的是Postgresql还是MS SQL Server?(请不要标记未涉及的产品。)我刚刚删除了它。错误很明显。您使用的是Postgresql还是MS SQL Server?(请不要给未涉及的产品贴标签。)我刚刚删除了它。错误很明显。你的答案出现在低质量的队列中,主要是因为你只提供了代码。你能解释一下你使用了NULLIF和CAST的什么魔力吗?你的答案出现在低质量的队列中,主要是因为你只提供了代码。你能解释一下你使用了什么样的无主和施法魔法吗?