在论坛中出现的比较难的sql问题:17(字符分拆2)
最近,在论坛中,遇到了不少比较难的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 ALL
SELECT 1,2,0 UNION ALL
SELECT 2,1,0 UNION ALL
SELECT 1,111,0 UNION ALL
SELECT 11,11,0
go
--1.字符串分拆函数
if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
drop function dbo.f_splitSTR
go
create function dbo.f_splitSTR
(
@s varchar(8000), --要分拆的字符串
@split varchar(10) --分隔字符
)
returns @re table( --要返回的临时表
col varchar(1000) --临时表中的列
)
as
begin
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 --返回临时表
end
go
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 #temp
from 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)
go
exec Pro_A '1,2;11,11'
/*
aid bid statuss
1 2 0
11 11 0
*/
另一种方法:
if object_id('dbo.Pro_A') is not null
drop proc Pro_A
go
create PROC dbo.Pro_A
@param varchar(100)
AS
declare @str varchar(100)
declare @sql nvarchar(4000)
set @str = @param
set @sql = ''
set @str = replace(replace(replace(replace(REPLACE(@str,'[',''),']',''),'},{',';'),
'{',''),'}','')
set @str = 'select '+replace(replace(@str,';',' union select '),':','=')
if OBJECT_ID('tempdb..#temp') is not null
drop table #temp
CREATE 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 @str
go
exec Pro_A '[{aid:1,bid:2},{aid:11,bid:11}]'
/*
aid bid statuss
1 2 0
11 11 0
*/
在论坛中出现的比较难的sql问题:17(字符分拆2)的更多相关文章
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- Vue-CLI 标准开发工具-快速准备环境和创建项目
https://cli.vuejs.org/zh/ 淘宝镜像安装: npm install -g cnpm --registry=https://registry.npm.taobao.org 2.x ...
- 手动安装sublimeText3插件
就在今天下午,我花了一个小时的时间安装sublime3插件stylus,就是为了让stylus文件能够高亮显示.网上找了很多方法,可以通过package control安装,然而,我的sublime ...
- Mac OS -bash: psql: command not found 使用 psql 命令报错
使用 psql 在 mac os 系统上登录,系统显示没有 psql 这个命令存在 解决方法如下: 将 postgresql 的 bin 目录添加到环境变量中即可 export PATH=" ...
- npm WARN deprecated fsevents windows
更新下 使用yarn貌似会帮助跳过这个问题: info fsevents@2.1.2: The platform "win32" is incompatible with this ...
- Python“文件操作”Excel篇(上)
大家好,我们今天来一起探索一下用Python怎么操作Excel文件.与word文件的操作库python-docx类似,Python也有专门的库为Excel文件的操作提供支持,这些库包括xlrd.xlw ...
- SUPERSOCKET.CLIENTENGINE 简单使用
首先 引用 SuperSocket.ClientEngine.Core.dll和 SuperSocket.ClientEngine.Common.dll 然后 就可以使用ClientEngine了. ...
- iptables 的安装与配置
iptables 的安装与配置 由于centos7默认是使用firewall作为防火墙,下面介绍如何将系统的防火墙设置为iptables. #停止firewall systemctl stop fi ...
- 【linux】Linux 运行进程实时监控pidstat命令详解
简介 pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存.设备IO.任务切换.线程等.pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上 ...
- Python 初级 5 判断再判断
复习: 1 三种数据类型: 整数:int, (1, 2, 200) 浮点数: float(2.0, 9.5, 100.38) 字符串: str("小明", "abc&qu ...
- DECODE函数和CASE WHEN 比较
http://blog.csdn.net/zhangbingtao2011/article/details/51384393 一,DECODE函数 其基本语法为: DECODE(value, if1, ...