select * A where id in (select 字符型 from B ),怎样才能执行?

恰好 2017-11-01 07:58:51
字符串的内容是另一张表的字符型字段abc,内容为:3427,3432

select * A where id in (select abc from B )
执行以上语句,mssql会提示:
在将 nvarchar 值 '3427,3432' 转换成数据类型 int 时失败。

已经试了用 依然不行
...全文
561 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
听雨停了 2017-11-02
  • 打赏
  • 举报
回复
引用 2 楼 恰好的回复:
表B结构: id  abc 1 3427,3432 2 1235,4568,7546 3 2456 写的简单了,实际上是 select * A where id in (select abc from B where id=1 ) 执行结果为 在将 nvarchar 值 '3427,3432' 转换成数据类型 int 时失败。
你要先把b表的字符以逗号拆分成多个数字,这样才能in
吉普赛的歌 2017-11-02
  • 打赏
  • 举报
回复
USE tempdb
GO
CREATE TABLE a (id INT)
CREATE TABLE b (abc NVARCHAR(50))
INSERT INTO a VALUES(3427)
INSERT INTO b VALUES('3427,3432')

--方法1
SELECT * FROM a CROSS APPLY  b 
WHERE ','+b.abc+',' LIKE '%,'+cast(a.id AS VARCHAR(50))+',%'
/*
id	    abc
3427	3427,3432
*/
--方法2
--1. 加函数
GO
IF OBJECT_ID('[dbo].[Fun_Split]') IS  NOT NULL DROP FUNCTION [dbo].[Fun_Split] 
GO
-- =============================================
-- Author     :	yenange
-- Create date: 2014-03-04
-- Description:	切分字符串
-- Example    : SELECT * FROM [dbo].[Fun_Split]('a,b,d,c',',')
-- =============================================
CREATE FUNCTION [dbo].[Fun_Split]  
(  
    @str    NVARCHAR(MAX),  
    @separator  NVARCHAR(MAX)  
)
RETURNS TABLE 
AS
RETURN
(
	SELECT ROW_NUMBER() OVER (order by (select 0)) AS rowNum, B.id  
	FROM   (
			SELECT [value] = CONVERT(XML, '<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')  
		   ) A  
		   OUTER APPLY(  
		SELECT id = N.v.value('.', 'nvarchar(max)')  
		FROM   A.[value].nodes('/v') N(v)  
	) B
	WHERE ISNULL(B.id,'')!=''
)
GO
SELECT * FROM  a WHERE a.id IN (
SELECT fs.id FROM b CROSS APPLY [dbo].[Fun_Split](b.abc,',') AS fs
)
/*
id
3427
*/
  • 打赏
  • 举报
回复
引用#1楼数据
if not object_id(N'Tempdb..#A') is null
    drop table #A
Go
Create table #A([id] int,[name] nvarchar(23))
Insert #A
select 1,N'测试1' union all
select 2,N'测试2' union all
select 3427,N'测试3' union all
select 3432,N'测试4' union all
select 3355,N'测试5'
GO
if not object_id(N'Tempdb..#B') is null
    drop table #B
Go
Create table #B([abc] nvarchar(29))
Insert #B
select N'3427,3432' union all
select N'11111'
Go

select a.* from #a a 
where exists
	(select 1 from #b b 
		where 
			charindex(','+cast(a.id as varchar(10))+',',','+b.abc+',')>0
	)
id	name
3427	测试3
3432	测试4
  • 打赏
  • 举报
回复
直接 charindex 判断不行么
zbdzjx 2017-11-02
  • 打赏
  • 举报
回复
网上搜:sql server 拆分字符串 将子查询中的结果按逗号拆分。
  • 打赏
  • 举报
回复
转xml不错
matsuojia 2017-11-01
  • 打赏
  • 举报
回复
你a表id和b表abc的字段类型不一样吧 一个是数值型 一个是字符型
恰好 2017-11-01
  • 打赏
  • 举报
回复
表B结构: id  abc 1 3427,3432 2 1235,4568,7546 3 2456 写的简单了,实际上是 select * A where id in (select abc from B where id=1 ) 执行结果为 在将 nvarchar 值 '3427,3432' 转换成数据类型 int 时失败。
二月十六 2017-11-01
  • 打赏
  • 举报
回复
用动态语句执行
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([id] int,[name] nvarchar(23))
Insert #A
select 1,N'测试1' union all
select 2,N'测试2' union all
select 3427,N'测试3' union all
select 3432,N'测试4' union all
select 3355,N'测试5'
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([abc] nvarchar(29))
Insert #B
select N'3427,3432' union all
select N'11111'
Go
--测试数据结束
--楼主的语句有问题,按语句的意思是id为'3427,3432'和'11111'的数据,但是看楼主描述是id为3427,3432值,所以不能把B表数据全部读取
DECLARE @sql NVARCHAR(max)='
SELECT * from #A where id in ('+(SELECT TOP 1 abc FROM #B)+')'
EXEC(@sql)


22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧