• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

在论坛中出现的比较难的sql问题:17(字符分拆2)

mysql 搞代码 4年前 (2022-01-09) 82次浏览 已收录 0个评论

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。 1、存储过程 表A: aid bid status 1 1 0 1 2 0 2 1 0

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

1、存储过程

表A:
aid bid status
1 1 0
1 2 0
2 1 0
1 111 0
11 11 0

每条数据aid 联合bid 是唯一的,如何写存储过程进行批量操作。

传入[{aid:1,bid:2},{aid:11,bid:11}]
查询出下表数据:

aid bid status
1 2 0
11 11 0

建表语句:

CREATE TABLE A(aid      INT, bid      INT, statuss  INT )INSERT A SELECT 1,1,0 UNION ALLSELECT 1,2,0 UNION ALL            SELECT 2,1,0 UNION ALLSELECT 1,111,0 UNION ALLSELECT 11,11,0go
--1.字符串分拆函数if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')   drop function dbo.f_splitSTRgocreate function dbo.f_splitSTR(	@s varchar(8000),     --要分拆的字符串	@split varchar(10)    --分隔字符) returns @re table(                      --要返回的临时表                     col varchar(1000)  --临时表中的列                  )asbegin     declare @len int    set @len = LEN(@split)      --分隔符不一定就是一个字符,可能是2个字符    while CHARINDEX(@split,@s) >0  begin	insert into @re 	values(left(@s,charindex(@split,@s) - 1))		set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'')    --覆盖:字符串以及分隔符  end    insert into @re values(@s)    return   --返回临时表endgo  CREATE PROC dbo.Pro_A@param varchar(100)AS declare @str varchar(100)declare @sql nvarchar(4000)set @str = ''set @sql = ''if OBJECT_ID('tempdb..#temp') is not null   drop table #temp--把拆分后的字段,插入到临时表select LEFT(col,charindex(',',col)-1) as aid,       SUBSTRING(col,charindex(',',col)+1,LEN(col)) as bid       into #tempfrom dbo.f_splitSTR(@param,';') t--生成动态语句set @sql = 'SELECT *             FROM A            WHERE exists(select 1 from #temp                          where #temp.aid = a.aid and #temp.bid = a.bid)'exec(@sql)goexec Pro_A '1,2;11,11'/*aid	bid	statuss1	2	011	11	0*/

另一种方法:

if object_id('dbo.Pro_A') is not null   drop proc Pro_Agocreate PROC dbo.Pro_A@param varchar(100)AS declare @str varchar(100)declare @sql nvarchar(4000)set @str = @paramset @sql = ''set @str = replace(replace(replace(replace(REPLACE(@str,'[',''),']',''),'},{',';'),                   '{',''),'}','')             set @str = 'select '+replace(replace(@str,';',' union select '),':<a>本文来源gao*daima.com搞@代#码&网6</a>','=')if OBJECT_ID('tempdb..#temp') is not null   drop table #tempCREATE TABLE #temp(aid      INT, bid      INT)--把数据插入到临时表中insert into #temp(aid,bid)exec(@str)--生成动态语句set @sql = 'SELECT *             FROM A            WHERE exists(select 1 from #temp                          where #temp.aid = a.aid and #temp.bid = a.bid)'exec(@sql)--print @strgoexec Pro_A '[{aid:1,bid:2},{aid:11,bid:11}]'/*aid	bid	statuss1	2	011	11	0*/

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:在论坛中出现的比较难的sql问题:17(字符分拆2)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址