重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如果字符串只有开头有零,而字符串中间没有0,那么可以使用replace(字符串,'0','')
在永康等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、成都网站建设 网站设计制作按需定制制作,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销,外贸营销网站建设,永康网站建设费用合理。
如果0开头最长的位数不长,那么可以逐个判断。
比如我可能知道这里面最长的就是连续5个0开头的,这样我就判断如果遇到5个0开头的就截掉前五位,4个0开头截掉前四位,3个0开头截掉前三位,一直到1,逐个判断使用case when可以完成.但是如果最长的0开头个数不确定,就比较麻烦了。
select id
from (select id,decode(id,0,0,1) as flag from table_name) t
order by flag desc,id
;
这样id=0的部分就会排在最下面
其实我觉得这种情况做个试验最好了,自己建个分区表,然后把每个分区建的小一点,分别插入数据看哪个分区的数据比较大就可以了 。
create table temp1
(month1 integer,
column1 varchar2(10))
PARTITION BY LIST ("MONTH1")
(PARTITION "M11" VALUES (201011)
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 1024 NEXT 1024 MINEXTENTS 1 MAXEXTENTS 5242880
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) , PARTITION "M12" VALUES (201012)
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 1024 NEXT 1024 MINEXTENTS 1 MAXEXTENTS 5242880
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
);
insert into temp1
values(201011,'0000000000');
commit;
insert into temp1
values(201012,'0');
commit;
declare i integer;
begin
for i in 1..16
loop
insert into temp1 select * from temp1;
commit;
end loop;
end;
select t.bytes,t.partition_name from dba_segments t where t.SEGMENT_NAME='TEMP1';
结果应该是
2097152 M11
1048576 M12
给你做个试验你就知道了
create table test
(id varchar2(6));
insert into test values ('120000');
insert into test values ('120010');
insert into test values ('120200');
insert into test values ('123000');
insert into test values ('123001');
commit;
执行第一遍:
update test set id=substr(id,1,5) where id like '%0';
commit;
此时结果:
执行第二遍:
update test set id=substr(id,1,4) where id like '%0';
commit;
后边就不举例了,也就是语句执行4遍,需要修改里边的参数。
这个只能写存储过程了。
思路:
1、遍历user_tables里面所有的表
2、遍历每一个表的所有列
3、update操作
这个要循环嵌套一个循环才能完成。
存储过程代码如下(未测试):
CREATE OR REPLACE PROCEDURE UpdateTableSetNull IS
DECLARE CURSOR C_JOB IS
SELECT TABLE_NAME FROM USER_TABLES;
C_ROW C_JOB%ROWTYPE;
VAR_TABLE_NAME USER_TABLES.TABLE_NAME%TYPE;
BEGIN
OPEN C_JOB;
LOOP
FETCH C_JOB INTO C_ROW;
EXIT WHEN C_JOB%NOTFOUND;
VAR_TABLE_NAME := C_ROW.TABLE_NAME;
DECLARE
CURSOR C_JOB_1 IS
SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = VAR_TABLE_NAME;
C_ROW_1 C_JOB_1%ROWTYPE;
VAR_COLUMN_NAME USER_TAB_COLUMNS.COLUMN_NAME%TYPE;
BEGIN
OPEN C_JOB_1;
LOOP
FETCH C_JOB_1 INTO C_JOB_1;
EXIT WHEN C_JOB_1%NOTFOUND;
VAR_COLUMN_NAME := C_ROW.COLUMN_NAME;
UPDATE VAR_TABLE_NAME SET VAR_COLUMN_NAME = 0 WHERE VAR_COLUMN_NAME IS NULL;
END LOOP;
CLOSE C_JOB_1;
END LOOP;
COMMIT;
CLOSE C_JOB;
END;
END UpdateTableSetNull;
我写一份,你试试,看看能不能通过一个SQL就能完成
select t.employee_id employee_id,
t.department_id department_id,
min(t.start_date) date,
min(t.start_date) start_date,
max(t.end_date) end_date,
(select t2.position
from table_name t2
where t2.employee_id = employee_id
and t2.department_id=department_id
and t2.end_date =end_date ) position
from table_name t
group by employee_id,
department_id,
position