首页 > 数据库 >根据某一指定的表名、列名及列值来向前或向后N条查相关列值的SQL自定义标量值函数

根据某一指定的表名、列名及列值来向前或向后N条查相关列值的SQL自定义标量值函数

时间:2023-02-27 21:04:15浏览次数:41  
标签:processid code 及列值 自定义 process SQL sql where select


有时需要根据某一指定的列的值来向前或向后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。

标签:processid,code,及列值,自定义,process,SQL,sql,where,select
From: https://blog.51cto.com/JohnsonJu/6089166

相关文章

  • MySQL 学习(一)MySQL 是什么?
    MySQL是什么。MySQL是开放源代码的关系型数据库管理系统,就是说别人可以修改源代码的,进行二次开发,做出适合自己项目组的MySQL。像阿里公司就修改过MySQL源代码,然后做出......
  • MySQL 学习(二)常见的数据库有哪些?
    那我们再来看下其他几款数据库管理软件。排名第一的Oracle,它是一个商业的关系型数据库管理软件,公司的名字也叫做Oracle。Oracle功能丰富,但是收费也比较高。 排名第三的......
  • MySQL 学习(三)索引有哪些缺点?
    任何事物都有其两面性,索引有优点,必定也会有缺点,那索引有什么缺点呢? 1、创建索引和维护索引要耗费时间就好比图书馆借书和还书都是需要图书管理员来的维护,如果长期没人管,图......
  • mysql报错 ERROR 1805 (HY000): Column count of mysql.user is wrong. Expected 45,
    ERROR1805(HY000):Columncountofmysql.useriswrong.Expected45,found43.Thetableisprobablycorrupted低版本mysql迁移到高版本出现的用户表错误解决办......
  • docker安装mysql
    前言:docker安装mysql前需要在系统安装docker环境,安装docker环境这里就不演示了,​​https://www.runoob.com/docker/centos-docker-install.html​​这里有centos安装docker......
  • sql操作数据
    给指定列添加数据:insertintostu(id,name)values(1,'张三');insertintostuvalues(1,'张三');--所有列时,列表可省略(不建议)insertinto......
  • sql对表table操作
    查询当前数据库下所有表名称:showtables;查询表结构:descuser;创建表:createtabletb_user(idint,ageint,scoredouble(5,......
  • mysql数据库的级联复制
    今天分享的是mysql数据库中的级联复制,要想实现mysql的级联复制首先要进行建立主从复制,在其基础上增加新的主机。范例:实现级联复制需要在中间的从服务器启用以下配置,实现中......
  • 对象自定义事件
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceEve......
  • 升级mysql
    1.先备份之前的数据库进入mysqldump-u用户-p--all-databases>保存备份文件的路径及sql结尾的文件如:mysqldump-uroot-p--all-databases>D:\Backup.sql2.关......