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

时间:2016-08-18 11:01:48

标签: sql sql-server sql-server-2008

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

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

在此子查询中返回

select LEFT(Reports,    NULLIF(LEN(Reports)-1,-1))  
from repoAccess1 
where uid = 'VIKRAM'

返回     1,2

这意味着查询应该像

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

但是我收到了这个错误

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to numeric.

任何人都可以告诉我要修改以获得确切的答案

4 个答案:

答案 0 :(得分:2)

如果没有具体的表格定义,这有点难以辨别,但我很确定您正在尝试将不同的数据类型相互比较。如果是这种情况,您可以使用the CAST or the CONVERT function,例如:

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

更新:由于您已更新了问题:LEFT function会返回varcharnvarchar数据类型的结果。因此得到的查询将是

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

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

答案 1 :(得分:0)

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

在继续之前,请允许我强调,以逗号分隔的字符串存储值不是SQL方式。每个id应该有一行,并且定义了正确的类型和外键。

也就是说,有时候我们会遇到其他人非常糟糕的设计决策。如果是这种情况,您可以使用LIKE

select rptName 
from RptTable r
where exists (select 1
              from repoAccess1  a
              where a.uid = 'VIKRAM' and
                    ',' + a.reports + ',' like '%,' + cast(r.rpt_id as varchar(255)) + ',%'
             );

答案 2 :(得分:0)

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'
)

答案 3 :(得分:0)

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

似乎可能存在数据问题。 LEFT函数返回的数据之一是非数字的。为了找到该特定记录,您可以使用isnumeric函数。试试这样,

SELECT rptName
FROM RptTable
WHERE rpt_id IN (
        SELECT LEFT(Reports, NULLIF(LEN(Reports) - 1, - 1))
        FROM repoAccess1
        WHERE uid = 'VIKRAM'
            AND ISNUMERIC(LEFT(Reports, NULLIF(LEN(Reports) - 1, - 1))) = 1
        )