当前位置:网站首页>根据某一指定的表名、列名及列值来向前或向后N条查相关列值的SQL自定义标量值函数
根据某一指定的表名、列名及列值来向前或向后N条查相关列值的SQL自定义标量值函数
2022-04-23 06:27:00 【大可山人】
有时需要根据某一指定的列的值来向前或向后N条查相关的列值,那么用此SQL自定义标量值函数可以取得相关的SQL语句:
ALTER FUNCTION GetPreviousNextCodeSql
(
@tableName varchar(50),
@codeFieldName varchar(50),
@currentCode varchar(50),
@idKey varchar(50),
@step int
) --('B_ProcessList','process_code','OCV3','processid',-1)
RETURNS varchar(2000)
AS
BEGIN
DECLARE @result varchar(50), @sql varchar(2000)
set @result=''
--判断是否有idx列名,如有,使用idx排序,否则使用processid排序
--if exists(select 1 from syscolumns where name='idx' and id=object_id(@tableName))
--Begin
set @sql = 'select t.'+ @codeFieldName +' from ('
set @sql = @sql +'select row_number() over (order by ' + @idKey +' asc) as p, ' + @codeFieldName +' from ' + @tableName
set @sql = @sql +') as t'
set @sql = @sql + ' where t.p =('
set @sql = @sql +' select top 1 m.p'
IF @step>0
set @sql = @sql +'+'
ELSE
set @sql = @sql
set @sql = @sql + convert(varchar,@step)
set @sql = @sql +' from ('
set @sql = @sql +' select row_number() over (order by ' + @idKey +' asc) as p, ' + @codeFieldName +' from ' + @tableName
set @sql = @sql +') as m where ' + @codeFieldName + '=''' + @currentCode +''')'
return @sql
--End
--return ''
END
调用时(举例):
--查上面第二条记录
select dbo.GetPreviousNextCodeSql('B_ProcessList','process_code','OCV3','processid',-2)
--查后面第二条记录
select dbo.GetPreviousNextCodeSql('B_Process_Flow','flow_code','GY002','id',+1)
调用后生成的语句类似如下:
select t.process_code from (select row_number() over (order by processid asc) as p, process_code from B_ProcessList) as t where t.p =( select m.p-2 from ( select row_number() over (order by processid asc) as p, process_code from B_ProcessList) as m where process_code='OCV3')
关键语句:
--查上一条工序记录
select t.process_code from (
select row_number() over (order by processid asc) as p, process_code from B_ProcessList
) as t
where t.p =(
select m.p-1 from (
select row_number() over (order by processid asc) as p, process_code from B_ProcessList
) as m where process_code='OCV3')
当然也可以使和类似的语句来实现,但灵活性不如上面的做法,因为只能向上或向下查前/后一条:
--查下一条工序记录
select process_code from B_ProcessList where processid=
(select max(processid) from B_ProcessList where processid<
(select processid from B_ProcessList where process_code='OCV3'))
--查上一条工序记录
select process_code from B_ProcessList where processid=
(select min(processid) from B_ProcessList where processid>
(select processid from B_ProcessList where process_code='OCV3'))
OK。
版权声明
本文为[大可山人]所创,转载请带上原文链接,感谢
https://blog.csdn.net/johnsuna/article/details/81745440
边栏推荐
- js之DOM学习获取元素
- Custom time format (yyyy-mm-dd HH: mm: SS week x)
- Django uses MySQL database to solve error reporting
- NPM installation stepping pit
- 防抖和节流
- 对js中argumens的简单理解
- 7. sub query
- The difference and application of VR, AR and MR, as well as some implementation principles of AR technology
- c#读取INI文件和向ini文件写入数据
- 驼峰命名对像
猜你喜欢
反思 | Android 音视频缓存机制的系统性设计
C# 多个矩形围成的多边形标注位置的问题
简易随机点名抽奖(js下编写)
SAP CR传输请求顺序、依赖检查
ABAP CDS VIEW WITH ASSOCIATION示例
h5本地存储数据sessionStorage、localStorage
SAP 03-AMDP CDS Table Function using ‘WITH‘ Clause(Join子查询内容)
redis连接出错 ERR AUTH <password> called without any password configured for the default user.
js之什么是事件?事件三要素以及操作元素
Ogldev reading notes
随机推荐
What are the total number of all courses of Mr. Tang Xiaoyang, who is very popular in CSDN (question mark)
配置npm
RGB颜色转HEX进制与单位换算
MySQL storage engine
9.常用函数
8.分页查询
[self motivation series] you'll never be ready
9. Common functions
Ogldev reading notes
定位、修饰样式
Processing of common dependency module
6.聚合函数和分组统计
CSDN很火的汤小洋老师全部课程总共有哪些(问号问号问号)
10.更新操作
ABAP 实现发布RESTful服务供外部调用示例
3. Sort statement
int a = 1存放在哪
js之DOM事件
ABAP 从CDS VIEW 发布OData Service示例
【自我激励系列】到底是什么真正阻碍了你?