sql 删除表中的字段的最后一个字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 删除表中的字段的最后一个字符相关的知识,希望对你有一定的参考价值。

表A,删除【字段A】的最后一个字符【,】的sql应该怎么写?
111111,
222222,
333333,
444444,
555555,
还是在说清楚一点,可能之前说的不是很清楚。

表A,删除【字段A】的最后一个字符【,】的sql应该怎么写?

字段A
问题,回答,
教育,基本,
开学,升级,

我现在是要删除每一行的最后一个【,】,而中间不不删除。

如果就是要现在这种效果可以用UPDATE:
UPDATE A SET 字段名=SUBSTR(字段名,1,6);
如果想适用于所有类似SQL就这么写:
UPDATE A SET 字段名=SUBSTR(字段名,1,LENGTH(字段名)-1);追答

你SQL给我发下?

追问

UPDATE news SET key=SUBSTR(key,1,LENGTH(key)-1);我把问题补充了一下,应该详细了一点。

追答

UPDATE news SET key=SUBSTR(key,1,LENGTH(key)-1);
这样,你的第二个逗号是用的中文的“,”不是英文的就报错了

追问

字段A
问题,回答,
教育,基本,
开学,升级,

运行了之后,没有改变什么,还是一样,在帮忙看看吧

追答

你用的数据库是什么?我这边是ORACLE,然后我这边测试结果为:
111111
222222
333333
你update之后是在同一个会话中进行查询的么?

追问

是的,用的版本啊,我是新手,你看看是不是这个,phpmyadmin-5.0.90-community-nt

追答

我的sql是这么写的:
create table news (key varchar2(10));
insert into news values('111111、');
insert into news values('222222、');
insert into news values('333333、');
insert into news values('444444、');
insert into news values('555555、');
insert into news values('666666、');
commit;
select * from news;
UPDATE news SET key=SUBSTR(key,1,LENGTH(key)-1);
select * from news;
你要是表已经占用了就把“news”换成其他表名试试,我这边UPDATE前后两次查询出来的结果是不一样的

追问

算了,还是不行,就采纳你的吧,我在去开一个问题

参考技术A 1 .update A set BBB=left(字段A,len(字段A)-1)) 2. update 表 set 字段A=substring(字段A,0,len(字段)-1)追问

不行,两个都不行,错误提示

追答

这个方法实用sysbase数据库 oracle数据库用substr length

参考技术B update 表A set 字段A=replace(right(字段A,1),',','')追问

怎么运行之后字段中的数据都没有了?

参考技术C update A set A.a=replace(a,',','')追问

这个是删除字段里面所有的【,】,我只要删除最后一个【,】,应该怎么写?

追答

update A set A.a=substr(A.a,0,length(a)-1)

SQL删除不在另一个表中的行

【中文标题】SQL删除不在另一个表中的行【英文标题】:SQL delete rows not in another table 【发布时间】:2017-05-04 08:29:28 【问题描述】:

我正在寻找一种好的 SQL 方法(Oracle 数据库)来满足下一个要求:

    表 A 中删除 表 B 中不存在的行。 两个表的结构相同 有些字段是可为空的 列和行的数量巨大(要比较更多 100k 行和 20-30 列) 每一行的每个字段都需要从表 A表 B 进行比较。 这样的要求是由于必须每天运行一个流程,因为更改将来自 表 B

换句话说:表 A 减去表 B => 从 表 A

中删除记录
delete from Table A
           where (field1, field2, field3) in
                 (select field1, field2, field3
                    from Table A

                  minus
                  select field1, field2, field3
                    from Table B);

重要的是要提到 DELETE 子句中的普通 MINUS 失败,因为没有考虑可空字段上的空值(oracle 的结果未知,然后不匹配)。

我也成功地尝试了 EXISTS,但是我必须使用 NVL 函数将空值替换为虚拟值,我不想要它,因为我不能保证在 NVL 中替换的值会不是字段中的有效值。

有没有人知道一种方法来完成这样的事情?请记住 performance 和 nullable 字段是“必须的”。

谢谢你

【问题讨论】:

【参考方案1】:

decode 找到相同点(即使两个值都为空):

decode( field1, field2, 1, 0 ) = 1  

删除table2中未找到的table1中的行:

delete table1 t
 where t.rowid in (select t1.rowid
                     from table1 t1
                     left outer join table2 t2
                       on decode(t1.field1, t2.field1, 1, 0) = 1
                      and decode(t1.field2, t2.field2, 1, 0) = 1
                      and decode(t1.field3, t2.field3, 1, 0) = 1
                      /* ... */
                      where t2.rowid is null /* no matching row found */
                      ) 

使用现有索引

                      ...
                      left outer join table2 t2
                      on (t1.index_field1=t2.index_field1 or 
                          t1.index_field1 is null and t2.index_field1 is null)
                      and ...

【讨论】:

会尽力让你知道 ;)【参考方案2】:

在 where 子句中使用左外连接并测试 null

删除一个 从一个 a.x = b.x 上的左外连接 b 其中 b.x 为空

【讨论】:

不确定我是否正确理解了这样的“b.x 为空”:我想要将 a.x 与 b.x 进行比较,其中 a.x 可能为空,b.x 可能不为空,反之亦然。这种情况(将 null 与非 null 进行比较)应以任一方式标识为“不匹配”。你知道我的意思吗? 您可以扩展上述内容以加入所有需要的字段 - coalesce 允许您处理空值,即 where coalesce(a.x, 'zzUnlikelyValue') = coalesce(b.x, 'zzUnlikelyValue')【参考方案3】:

您是否考虑过 ORALCE SQL MERGE 语句?

【讨论】:

是的,我有,实际上我有一个 MERGE 语句,但是为了删除一行需要更新(我不希望这样的更新会“触发”一个将行复制到历史表+另一个触发器将删除的行复制到历史表,这意味着在删除操作中复制该行两次。【参考方案4】:

对大量记录使用批量操作。性能方面会更快。

并使用两个表之间的连接来获取要删除的行。可空列可以与一些默认值进行比较。

另外,如果你想让表A和表B相似,为什么不截断表A,然后从表b中插入数据

【讨论】:

谢谢,但是: - 我已经在使用 Bulk 来填充表 B(要与之比较的表)。 - 加入很好,但我想避免与默认值进行可空比较(这很危险,因为你不知道会发生什么并且可能会发生潜在的误导性匹配)。 - 我不能截断,因为我真的不希望表 A 类似于表 B,因为现有行也会更新。 但我想你必须为可空列提供默认值,否则我看不到任何其他方式。你可以给任何奇怪的值作为默认值 谢谢。我仍在尝试避免可空值的默认值。我不敢相信 oracle 没有提供一种优雅的方式来做这样的事情,比如比较 string.empty 或类似的东西,就像其他语言一样。【参考方案5】:

假设您在每个表上都有相同的 PK 字段...(拥有 PK 或其他一些唯一键对此至关重要。)

    create table table_a (id number, name varchar2(25), dob date);

    insert into table_a values (1, 'bob', to_date('01-01-1978','MM-DD-YYYY'));

    insert into table_a values (2, 'steve', null);

    insert into table_a values (3, 'joe', to_date('05-22-1989','MM-DD-YYYY'));

    insert into table_a values (4, null, null);

    insert into table_a values (5, 'susan', to_date('08-08-2005','MM-DD-YYYY'));

    insert into table_a values (6, 'juan', to_date('11-17-2001', 'MM-DD-YYYY'));

    create table table_b (id number, name varchar2(25), dob date);

    insert into table_b values (1, 'bob', to_date('01-01-1978','MM-DD-YYYY'));

    insert into table_b values (2, 'steve',to_date('10-14-1992','MM-DD-YYYY'));

    insert into table_b values (3, null, to_date('05-22-1989','MM-DD-YYYY'));

    insert into table_b values (4, 'mary', to_date('12-08-2012','MM-DD-YYYY'));

    insert into table_b values (5, null, null);

    commit;

    -- confirm minus is working
    select id, name, dob 
    from   table_a
    minus
    select id, name, dob
    from   table_b;

    -- from the minus, re-query to just get the key, then delete by key
    delete table_a where id in (
        select id from (
            select id, name, dob 
            from   table_a
            minus
            select id, name, dob
            from   table_b)
    );

    commit;

    select * from table_a;

但是,如果在某个时间点将 tableA 重置为与 tableB 相同,为什么不按照另一个答案的建议截断 tableA 并从 tableB 中全选。

100K 并不大。我可以在不到 1 秒的时间内对我的笔记本电脑实例进行约 100K 的截断和插入。

【讨论】:

正如我之前所说,MINUS 不适用于可空字段。另一方面,TableA 永远不必重置为与 TableB 相同的内容 我在本地使用 11G Express,通过 livesql.oracle.com 使用 12C。 MINUS 确实适用于空字段。如有必要,我可以提供示例。 是的,有这样的例子会很棒。可以复制剧本吗?如果可能,请尝试下一个场景(对我不起作用的场景): - 表定义中至少有 1 个字段可以为空。 - 以这样一种方式填充数据,即 TableA 中的行有一个为 NULL 的可空字段,TableB 有一些东西,例如“测试数据”。 - 以这样的方式填充数据,即 TableA 中的一行有一个为 NULL 的可为空字段,TableB 也有一个为 NULL 的字段。如果您尝试在上述条件下删除 TableA 中不在 TableB 中的行,它应该不起作用,至少对我来说不是。 THX 永远 发现可能是问题所在:表 B 没有 PK。如果减号仍然单独工作,这会影响删除操作吗? 任何唯一键都可以工作,单列或复合,但最好在非空列上,否则你将回到你开始处理 NVL 等的地方。【参考方案6】:
> DELETE FROM purchase WHERE clientcode NOT IN (
>     SELECT clientcode FROM client );

这将从购买表中删除其客户代码不在客户表中的行。 purchase表的clientcode引用client表的clientcode。

DELETE FROM TABLE1 WHERE FIELD1 NOT IN (SELECT CLIENT1 FROM TABLE2);

【讨论】:

据我所知,您的回答并未直接解决问题。

以上是关于sql 删除表中的字段的最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章

SQL增加删除更改表中的字段名

如何写sql 语句,能删除字段中某个字符到最后字符串的?

如何写sql 语句,能删除字段中某个字符到最后字符串的?

sql 表中一个字段含有大量的中文字符,怎么替换掉

如何用SQL语句删除两个表中相同的记录?

在SQL中如何删除表中的unique属性