作业帮 > 综合 > 作业

mySQL通过列值查询该值所在的列

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/29 07:56:20
mySQL通过列值查询该值所在的列
假设表的结构如下:
ID 列1 列2 列3 列4 列5
1 100
2 1001 300
3 111 400 500
目前知道的条件:
id是给定的,即行可以确定,然后需要查找出这一行中是否具有某一个列值,比如这一说,我现在要查找id为3,列值为400的列是哪一列,把这个值更新为空,即删除该值,请问怎么实现比较好呢.
1 如果只是想查询出是那一列,可创建一个自定义函数来实现:
delimiter |
drop function if exists fun_tab_test |
create function fun_tab_test (par_id int, par_comparevalue int)
returns varchar(20)
begin
declare rvalue varchar(20);
select ( case when count(*) = 0 then '' when b = par_comparevalue then 'b' when c = par_comparevalue then 'c' else '' end ) as colA
into rvalue from tab_naem where id = par_id;
return rvalue ;
end |
delimiter ;
使用:
select fun_tab_test(1, 400); --参数分别为传入的id和对比的值400
结果为含400值的列或''(没有找见包含的列)时,接下来做你想做的update或delete等即可;
2 如果要完成一个自动的update,可使用before update触发器,提供个简单示例,进行适应性修改:(这里n为表名,a为id列,b,c 为两个可能包含400值的列)
delimiter |
drop trigger if exists tr_n_before_update; |
create trigger tr_n_before_update before update on n
for each row begin
declare svalue int;
select b into svalue from n where n.a = new.a;
if svalue = 400 then
set new.b = 0;
end if;
select c into svalue from n where n.a = new.a;
if svalue = 400 then
set new.c = 0;
end if;
end; |
delimiter ;
再问: 你用的是delphi的吧,我最后还是决定使用两列实现,然后增加的时候增加行数,我这个是准备做成好友表的
再答: 1 上边回答中都是纯sql的函数和触发器。 2 你的这个需求应该设计成多对多的关系表的模式,比如 id = 1 时有多个值(把原来的多列集中到一列如b,可取100, 200, 400)的情况设计为: 表(id, b),数据如下: -------------------- id b 1 100 1 200 1 400 --------------------