oracle,两张表作关联,表1字段A,存在表2的B字段。但是A字段为varchar2,B字段为number型,要怎么转换查?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle,两张表作关联,表1字段A,存在表2的B字段。但是A字段为varchar2,B字段为number型,要怎么转换查?相关的知识,希望对你有一定的参考价值。

表1字段A,存储多个内容,中间用逗号隔开的。但是表2的B字段仅存一个内容

参考技术A 别人那搬来的
写function或procedure来分隔。
首先声明一个数组类型:
-- 字符串集合
TYPE Typ_Tab_Str IS TABLE OF VARCHAR(150) INDEX BY BINARY_INTEGER;
-- 写一个函数
CREATE OR REPLACE FUNCTION Fun_Stringtoarrary(P_Sourcestr IN VARCHAR2, -- 源字符串
P_Separator IN VARCHAR2, -- 分隔符
P_Arrary OUT Typ_Tab_Str -- 拆分后得到的数组
) RETURN NUMBER IS
n_Count NUMBER(6); -- 分隔符的个数
n_Posb NUMBER(6); -- 初始位置
n_Pose NUMBER(6); -- 分隔符的位置
BEGIN
-- 初始化
n_Count := 0;
n_Posb := 1;
-- 非空校验
IF Prm_Sourcestr IS NULL OR Prm_Separator IS NULL THEN
RETURN - 1;
END IF;
LOOP n_Pose := Instr(Prm_Sourcestr, Prm_Separator, n_Posb, 1);
n_Count := n_Count + 1;
IF n_Pose = 0 THEN
Prm_Arrary(n_Count) := Substr(Prm_Sourcestr, n_Posb, Length(Prm_Sourcestr) - n_Posb + 1);
EXIT;
END IF;
Prm_Arrary(n_Count) := Rtrim(Ltrim(Substr(Prm_Sourcestr, n_Posb, n_Pose - n_Posb))); n_Posb := n_Pose + Length(Prm_Separator);
END LOOP;
RETURN n_Count;
EXCEPTION
WHEN OTHERS THEN
RETURN - 1;
END Fun_Stringtoarrary;
因为oracle本身就没有数组类型,我们是通过索引表来模拟数组,其实就是一个仿数组的结构。上面的函数完全正确,属于常用自定义功能函数。
参考技术B 使用to_char()就行了。
你的语句这样写:
select 表1.*, 表2.* from 表1, 表2 where 表1.a = to_char(表2.b)追问

那如果表1字段A,存储多个内容,中间用逗号隔开的。但是表2的B字段仅存一个内容的要怎么弄呢。

追答

使用like进行模糊查询。这样写:
select 表1.*, 表2.* from 表1, 表2 where 表1.a like '''%' || to_char(表2.b) || '%'''

参考技术C select * from 表1 T1
left outer join 表2 T2 on T1.A=to_char(T2.b)

补充问题:
看你的需求,最终想查什么

如果表2(代码表)记录数少 用数组
如果表2(业务数据)记录多 用行列转换

前提都需要用存储过程,当然代码表记录少的话 用ASP JSP去匹配也行,还是要看你的需求
参考技术D 以上追问可以写成如下方法

select * from 表1 a join 表2 b on ','+a.A like '%,'+convert(varchar(50),b.B)+',%'

convert(varhcar(50),字段名)是指将字段转换成varchar类型

Oracle数据库,关于关联两张表更新问题

如有主表A,子表B,当主表A对应的子表B数据条数不为0,并且,所有子表B的数据中某字段(如status)都为30时,则更新主表A的status字段为30.。非常感谢

两表关联更新用如下方法。

有以下两张表:

根据test2表中的id和test1表中的id关联,修改test1表中name字段,语句如下:

update test1 a set a.name=(select b.name from test2 b where a.id=b.id) where a.id in (select id from test2);

更新后,test1表中结果:

参考技术A --因为没有给出a、b两个表的关联,所以用a.id和b.aid做了关联
update a aa set status=30
where
(select count(status) from b where a.id=b.aid)>0 --确定b表有A表子数据
and
(select count(status) from b where a.id=b.aid and b.status<>30)=0--b表子数据status<>30个数=0个,说明子数据status全部为30本回答被提问者采纳

以上是关于oracle,两张表作关联,表1字段A,存在表2的B字段。但是A字段为varchar2,B字段为number型,要怎么转换查?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库,关于关联两张表更新问题

Oracle两张表关联批量更新其中一张表的数据

Oracle两张表关联批量更新其中一张表的数据

java程序对Oracle两张表结构相似的表的数据对比,具体如下

oracle通过两张表更新一张表

oracle的数据库中怎么将一张表中数据插入另一张表,两张表都存在