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.
任何人都可以告诉我要修改以获得确切的答案
答案 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会返回varchar
或nvarchar
数据类型的结果。因此得到的查询将是
SELECT
[rptName]
FROM [RptTable]
WHERE [rpt_id] IN('1', '2')
请注意值周围的撇号(这是正确的术语吗?)。由于[rpt_id]
似乎是数据类型int
,因此无法隐式转换值。这就是上述CAST
或CONVERT
发挥作用的地方。
答案 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
)