【问题标题】:Change input value referring to database table更改参考数据库表的输入值
【发布时间】:2019-11-22 07:27:21
【问题描述】:

它有点复杂,但我试着解释一下。我在数据库中有一个表,看起来像这样。这是partno表

 ... |   Part No     | Convert | ...
 ... |    00000      |  ABC    | ...
 ... |    00001      |  DEF    | ...

所有输入值必须以 00000 或 00001 开头,例如 = 0000012345、000014321。

然后,根据这前 5 个值(00000 和 00001),将其转换为类似于 Convert 列。

例子:

输入:0000012345
预期:ABC12345

输入:000014321
预期:DEF4321

意思是我必须根据上表转换我得到的输入,但我不知道该怎么做。所以,我作弊并做出这样的查询:

Insert into pencil (pencil_no,lastdate) 
values('ABC'|| SUBSTR('" + pen + "',1,2), sysdate)

//pen is the input value

当我得到我想要的输出时它就起作用了。但不幸的是,这不是正确的方法,因为表中的数据会更新和更改。

谁能指导我如何做到这一点? 提前致谢

更新: 我按照以下答案中的指南进行操作:

insert into pencil(pencil_no, lastdate)
select c.convert || substr('"+ pen + "', 22, 11), sysdate
from partnotable c
where c.PART_NO = substr('" + pen + "', 1, 15)

并且我设法将它插入到我的数据库中。不幸的是,有一个错误是 UPDATE 或 INSERT 语句试图插入重复键。 对于在 DBMS MAC 模式下配置的 Trusted Oracle,您可能会看到 如果在不同级别存在重复条目,则会显示此消息。 我相信我输入的输入与表中的任何数据都不重复。当我运行查询时a rows have been inserted,我可以在我的数据库中查看它,但是当我运行程序时,输出不显示。

我尝试通过添加增量来遵循此方法http://www.lifeaftercoffee.com/2006/02/17/how-to-create-auto-increment-columns-in-oracle/,但仍然失败。

【问题讨论】:

    标签: sql database oracle sql-insert


    【解决方案1】:

    您的插入语句需要包含转换表的查找,我将在插图中将其称为 CONVERT_TABLE。

    您需要引用输入值两次,一次用于查找,一次用于插入值。我在这里使用 SQL*Plus 替换变量;您将需要调整语法以适应您正在运行的 SQL。您还需要使用正确的连接运算符,在 Oracle 中是 || 而不是 +

    insert into pencil (pencil_no,lastdate) 
    select c.convert || substr('&&input_value',6), sysdate
    from convert_table c
    where c.part_no =  substr('&&input_value',1, 5)
    

    这是一个糟糕的数据模型。一列代表两件事,在这种情况下,PART_NO 和(?)序列号违反了First Normal Form。结果是棘手的 SQL,通常在从表中选择时,有时在插入或更新时就像这里一样。正确的模型将为表中的每个键组成部分定义单独的列,并使用复合主键或唯一键。如果您需要 PENCIL 列的串联版本,您可以使用a virtual column to present it in queries

    【讨论】:

    • @PAC 谢谢先生!我按照您的指南进行操作,但遇到另一个错误。我会更新我的问题。
    【解决方案2】:

    您可以使用REGEXP_REPLACE将前5位数字(Part No)替换为convert中提到的值(convert),如下所示,您可以在插入语句中添加:

    给出“0000012345”作为输入

    SQL> WITH partno_table (PART_NO, CONVERT_) AS
      2  (SELECT '00000', 'ABC' FROM DUAL UNION ALL
      3  SELECT '00001', 'DEF' FROM DUAL)
      4  SELECT
      5      REGEXP_REPLACE('&&INPUT_VAUE', '^(' || PART_NO || ')',
      6                     CONVERT_) AS CONVERTED_VALUE,
      7      SYSDATE
      8  FROM PARTNO_TABLE
      9  WHERE REGEXP_LIKE ( '&&INPUT_VAUE',
     10                    '^('|| PART_NO || ')' );
    Enter value for input_vaue: 0000012345
    old   5:     REGEXP_REPLACE('&&INPUT_VAUE', '^(' || PART_NO || ')',
    new   5:     REGEXP_REPLACE('0000012345', '^(' || PART_NO || ')',
    old   9: WHERE REGEXP_LIKE ( '&&INPUT_VAUE',
    new   9: WHERE REGEXP_LIKE ( '0000012345',
    
    CONVERTED_VALUE SYSDATE
    --------------- --------------------
    ABC12345        22-NOV-19
    

    给出“000014321”作为输入

    SQL> WITH partno_table (PART_NO, CONVERT_) AS
      2  (SELECT '00000', 'ABC' FROM DUAL UNION ALL
      3  SELECT '00001', 'DEF' FROM DUAL)
      4  SELECT
      5      REGEXP_REPLACE('&&INPUT_VAUE', '^(' || PART_NO || ')',
      6                     CONVERT_) AS CONVERTED_VALUE,
      7      SYSDATE
      8  FROM PARTNO_TABLE
      9  WHERE REGEXP_LIKE ( '&&INPUT_VAUE',
     10                    '^('|| PART_NO || ')' );
    Enter value for input_vaue: 000014321
    old   5:     REGEXP_REPLACE('&&INPUT_VAUE', '^(' || PART_NO || ')',
    new   5:     REGEXP_REPLACE('000014321', '^(' || PART_NO || ')',
    old   9: WHERE REGEXP_LIKE ( '&&INPUT_VAUE',
    new   9: WHERE REGEXP_LIKE ( '000014321',
    
    CONVERTED_VALUE SYSDATE
    --------------- --------------------
    DEF4321         22-NOV-19
    
    SQL>
    

    干杯!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多