菜鸟sql的日常(一)

小菜鸟一只,大神勿喷。【乖巧】

两张表

   aaa表


    bbb表

bbb 表的modelid  是 aaa表的id值   字符串类型  组成 1,2这样的形式 并且不固定  也可能是1,2,3,4这种

需要得到的效果

将aaa表的name字段根据 bbb 表 的madelid字段中 id  的顺序显示到一个字段


 用了sql中的STUFF函数

这个函数可以用来删除 或者是修改某段字符中的某几个字

第一次的代码如下:

select *,STUFF(modelid,1,len(modelid), ( select top 1 (select  name+','  from aaa where id in (1,2) for xml path('') ) as hh from aaa t2  where id in (1,2)) ) as a  from bbb

这句代码可以实现效果 但是美中不足的是  数据为写死的值  这样就导致了代码很不灵活 

你会说  in中用 modelid代替好了  实验证明 这是行不通的  报错

 

 那么这到底是作什么妖呢  

原因是modleid值是varchar值  id是int值   正确的写法应该是 where id in(1,2,3)

而现在会变成 where id in(‘1,2,3’)

现在的问题是来解决将字符串类型改为int类型  圆满这次的sql语句 

一般普通的 如果是只有一个值的情况下  可以直接转成int类型的值 但是这里是多个值  明显行不通 经过百度  找到一个方法  sql语句如下:

  GO

CREATE FUNCTION fn_StringSplitTable

(

@str NVARCHAR(MAX),

@split NVARCHAR(10)

)

RETURNS TABLE

    AS

RETURN

(

SELECT B.id

FROM

(

SELECT [value] = CONVERT(XML , '<v>' + REPLACE(@str , @split , '</v><v>') + '</v>')

) A

OUTER APPLY

(

SELECT id = N.v.value('.' , 'nvarchar(100)')

FROM A.[value].nodes('/v') N ( v )

) B

)

Go

select *,STUFF(modelid,1,len(modelid), ( select top 1 (select  name+','  from aaa where id in (SELECT CAST(id AS INT) FROM dbo.fn_StringSplitTable(modelid, ','))  for xml path('') ) as hh from aaa t2  where id in (SELECT CAST(id AS INT) FROM dbo.fn_StringSplitTable(modelid, ','))) ) as a  from bbb ;

 

注意 这一定要带上go 形成代码块 

最后 问题圆满解决 

需要注意的是:这里还用了个知识点  把表格多行值  放到了一个字段中

 

select  id,(select  name+','  from aaa where id in (1,2) for xml path('') ) as hh from aaa t2  where id in (1,2)

 

介于条件问题  会生成多行一样的语句  暂时没想到办法 我的解决方案是  只取了第一条

End

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容