相关文章推荐
温柔的上铺  ·  [Pyplot] ...·  6 月前    · 

今天在无意间查询到一个SQL,有两张表,一张用户表,用户表中有个personroles字段,CLOB类型,里面是逗号分隔的角色id(A,B,C,D),需要查询每个人和其现有的角色。问题在于用户表和角色表的关联,直接left join用roles.id in (user.personroles),查询不出来,最后看到了ORACLE中有个函数instr

instr()函数的格式  (俗称:字符查找函数)

格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串)

格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] )   /   instr(源字符串, 目标字符串, 起始位置, 匹配序号)

解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。

最终写出的sql如下:

select a.chinaname,
a.personroles,
wm_concat(b.chinaname)
from sys_user a
join sys_roles b
on instr(',' || to_char(a.personroles) || ',', ',' || b.id || ',') > 0
where a.delstatus = 0
group by a.chinaname, a.personroles;

查询结果正确。

在做项目的过程 ,发现开发库 某张 的某 字段 有许多值是空的,而测试库 字段 的值则是有的。   那么,有什么办法能将测试库 字段 的值更新到开发库 呢? SQL Server 这是比较容易解决的,而 Oracle 不知道方法了。 SQL Server 类似问题的解决方法   后来只好用笨的方法:   首先,将数据复制到Excel;(假设称测试库的 为A–含有数据)   然后,在开发库 建立和 A同结构的 B;(这里为了导入数据的简单,我对 B的结构进行了改造,只有两个 字段 )   图 B的数据   再利用PL SQL 的导入功能将这些数据导入到 B (此时 B的数据 转自:doshre 1)instr()函数的格式 (俗称:字符查找函数) INSTR( string, substring [, start_position [, th_appearance ] ] ) string - 要搜索的字符串。字符串可以是CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB或NCLOB等类型。 substring - 要在字符串(string) 搜索的子字符串。 子字符串可以是CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB或NCL ORACLE 学习笔记--基本select语句、函数、多 关联 select name,age from users;select name,age from users where age>20;select a.name,... select A . 字段 1,A . 字段 2,B . 字段 返回,C . 字段 返回 from A ,B ,C [where A ,B ,C 关联 及各自的条件语句]但是这个方法有一个缺点,那就是在动态的生成这个查询语句的业务逻辑程序仍然很复杂。这里就介绍一个降低业务逻辑复杂度的查询 sql 生成方式。其语法结构如下:select A . 字段 1,A . 字段 2,B . 字段 ,C . 字段 from A [where... select si.ID_NUMBER,p.POLICYFLAG,p.PAY_TIME   from STUDENTS_INFO si left join orders o on si.ID_NUMBER = o.CID LEFT join policies p ON p.ORDER_ID = o.ORDER_ID where ... A、B两张 ,通过 关联 字段 复制B 数据到A update A a set a.A2 = (select b.B2 from B b where b.B1=a.A1) where exists (select 1 from B where B.B1=a.A1) update A a set a.A2 = (select b.B2 from B b, A c where b.B1= 在设计数据库 时,当有 关联 另外的 一张 时,我们会将另一个 的主键,以逗号分隔存在主 的一个 字段 里。 当用my sql 数据库时,我们会使用find_in_set()函数,例: select ys.id, group_concat(b.name) from a left join b on find_in_set(b.id, a.bids) group bya.id 但是在 oracle 并没有find_in_set()函数,所以我们可以使用instr()函数。 select ys.id, wm_conc. 假设现在有两个 一:idnumsnamescore140643851小A87140643856小B88140643931小C92140643611小D77140643427小E81140643155小F95140643815小G78140643492小H90140643653小I71 二:idonameevent1001小a小a在2017-10-19通知了学号为140643851,1406438... oracle 关联 查询和子查询一、多 关联 查询例子: SQL > create tablestudent1(sidvarchar(3),snamevarchar(6),sagenumber(3));Tablecreated. SQL > create tablecourse1(sidvarchar(3),cnamevarchar(8),cnonumber(3));Table created.... 我的 Oracle 有个 a 由三个 字段 jiebie1,jiebie2,jiebie3, 还有等级 b a jiebie1,jibie2,jibie3 1 2 3 b dengji mingcheng 0 不称职 1 基本称职 2 ... 连接查询 【小编用的是 Oracle 数据库, Oracle 数据库区分 名与 字段 名的大小写,所以大家进行查询的时候记得注意双引号哟~】 有 名:AAA 字段 : id name tag 名:BBB 字段 : id ban qq 名:AABB 字段 : id area location分类:1.内连接 inner join select 列名 from 主 inner join 从 ... 背景:A 、B 关联 关联 出来的结果里B 有不止一条,需求是只要B 结果 的某一条(按某 字段 排序)经过百度,发现row_number() over(partition by a order by b desc)函数可用(需要说明下,order by 必须有缺少会报错),以下是数据环境及结果。创建数据环境 create table A(ANAME varchar(20));insert int...