select *... where id in (select 字符串 from ... )问题?

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

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

已经试了用 select * A where id in (select REPLACE(abc,'''','') from B ) 依然不行

...全文
759 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 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
*/
二月十六 2017-11-02
  • 打赏
  • 举报
回复
引用 5楼我是你的主体 的回复:
我语句写的简单了,实际上是 select * A where id in (select abc from B where id=1 )
用动态拼接的方式,看前边我写的代码
恰好 2017-11-01
  • 打赏
  • 举报
回复
我语句写的简单了,实际上是 select * A where id in (select abc from B where id=1 )
恰好 2017-11-01
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
3 2456
所以楼主想要B表中id 为几的数据作为in 的条件?就把动态拼接的那个select 语句改一下就行了,加一个where 条件来控制in 的数据[/quote] 在将 nvarchar 值 '3427,3432' 转换成数据类型 int 时失败。
二月十六 2017-11-01
  • 打赏
  • 举报
回复
引用 2楼我是你的主体 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] --楼主的语句有问题,按语句的意思是id为'3427,3432'和'11111'的数据,但是看楼主描述是id为3427,3432值,所以不能把B表数据全部读取
表B结构: id  abc 1 3427,3432 2 1235,4568,7546 3 2456[/quote]所以楼主想要B表中id 为几的数据作为in 的条件?就把动态拼接的那个select 语句改一下就行了,加一个where 条件来控制in 的数据
恰好 2017-11-01
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
--楼主的语句有问题,按语句的意思是id为'3427,3432'和'11111'的数据,但是看楼主描述是id为3427,3432值,所以不能把B表数据全部读取
表B结构: id  abc 1 3427,3432 2 1235,4568,7546 3 2456
二月十六 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创作助手写篇文章吧