【问题标题】:Insert a column with single quote or Apostrophe in Oracle在 Oracle 中插入带单引号或撇号的列
【发布时间】:2020-04-09 21:18:06
【问题描述】:

我正在尝试从 Person 表插入 Table Users。

但是,person 表中的 first_name 列在名称中包含撇号 (Eg-Rus'sell),这使我无法成功插入。我该如何解决这个问题?

INSERT INTO USERS VALUES (SELECT FIRST_NAME,.........FROM PERSON);

【问题讨论】:

  • 您在帖子中所说的不是真的。如果表 PERSON 已经存在,列 FIRST_NAME(可能还有 LAST_NAME)为 VARCHAR2 数据类型,并且您在其中一列中有 Russ'sell 之类的名称,则 Oracle 将这些字符串值从 PERSON 复制到表 USERS 绝对没有问题INSERT 语句,和你写的完全一样。如果您尝试直接插入值,例如 INSERT INTO USERS VALUES ('John', 'Rus'sell'),将会遇到困难(很容易解决) - 但这不是您在问题。
  • 删除了我的 cmets 以防止误解,谢谢@mathguy!

标签: sql oracle sql-insert


【解决方案1】:

插入用户值(选择 FIRST_NAME,.........FROM PERSON);

首先,您的插入语句语法不正确。它将引发ORA-00936: missing expression。从源表中插入多条记录的正确语法是:

INSERT INTO table_name SELECT columns_list FROM source_table;

VALUES 关键字用于使用以下语法将单个记录插入表中:

INSERT INTO table_name(columns_list) VALUES (expressions_list);

如果您已经将值存储在另一个表中,那么简单的 INSERT INTO..SELECT FROM 应该可以正常工作。但是,如果你想INSERT INTO..VALUES 有单引号,那么最好的方法是使用Quoting string literal technique 语法是q'[...]',其中“[”和“]”字符可以是以下任意一个因为它们还没有出现在字符串中。

  • [ ]​​i>
  • { }
  • ( )

您不必担心字符串中的单引号。

create table t(name varchar2(100));
insert into t values (q'[Rus'sell]');
insert into t values (q'[There's a ' quote and here's some more ' ' ']');
select * from t;

NAME
-----------------------------------------------
Rus'sell
There's a ' quote and here's some more ' ' '

【讨论】:

  • 很好的解释。不过,您可以使用 any non-whitespace character 作为引号分隔符,而不仅仅是括号。例如q'?O'Toole?', q'#O'Toole#', q'!O'Toole!', q'cO'Toolec'.
  • 没错。这只是个人喜好使用哪个字符,我提到了这些! [ ] { } ( ) 作为我喜欢的示例,以提高代码的可读性。
【解决方案2】:

我认为你的问题没有显示完整的细节,因为我可以毫无问题地执行以下语句:

create table person( first_name varchar2(100));
create table users( first_name varchar2(100));
insert into person values ('Rus''sell');
insert into users select first_name from person;

【讨论】:

    【解决方案3】:

    如果问题中有任何含糊之处,我们深表歉意。我正在使用的查询是一个带有多个连接的长插入查询。

    总而言之,它是一个存储过程,我在其中进行插入,其数据由具有多个连接的长选择查询给出。其中一列是 FIRST_NAME 列,其中包含一些带有撇号的值(Rus'sell,Sa'm)。

    Insert 语句值生成如下,导致 'ORA-00917: missing comma' 错误。

    INSERT INTO TABLE_NAME values (314159,0,'Rus'sell','Parks','...........) 
    

    我通过将 select 中的列从单引号替换为两个单引号来解决此问题,然后将其提供给基本上解决了问题的插入语句。

    REPLACE(FIRST_NAME,'''','''''') AS FIRST_NAME
    

    希望对你有帮助。

    【讨论】:

    • 嗯,是的 - 它“解决了”它,但维护起来却是一场噩梦。谁知道哪个单引号代表什么? @Lalit 建议的 q 引用机制是可行的方法(在我看来)。
    • 同意,将改为单引号表示。
    猜你喜欢
    • 2018-11-15
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2014-11-21
    • 2011-03-09
    • 2011-05-12
    相关资源
    最近更新 更多