【问题标题】:Get a unique hash value based on value of 3 columns of a table根据表的 3 列的值获取唯一的哈希值
【发布时间】:2014-09-21 19:53:14
【问题描述】:

假设我在一个表中有 3 列 column_1,column_2,column_3

我想用 column_1,column_2,column_3 的每个唯一组合的唯一值填充两个新表 table_1.column_unique_indtable_2.column_unique_ind

我想稍后比较这两列,以检查 column_1、column_2、column_3 的唯一组合。

在这种情况下我可以使用任何内置的 oracle 函数吗?

我想要的是,

  1. 对于 column_1、column_2、column_3 的任何给定组合, 函数应该总是返回相同的唯一值,任何一天我使用这个函数。
  2. 对于 column_1、column_2、column_3 的两种不同组合, 函数应该总是返回不同的值

【问题讨论】:

  • 哈希值通常不是唯一的。仅使用 UNIQUE 约束保留 3 列有什么问题?
  • 是的,我们可以在表上使用唯一键,但是,只是想知道,有没有办法在 Oracle 中获得唯一的哈希值?另外,这样以后,每当我想比较两个表的值时,我的 sql 查询都会变得更简单。
  • column_1,column_2,column_3 的相同组合是否可以在原始表中出现多次 - 如果您可以添加唯一约束,可能不会?那么,为什么不只拥有一个合成主键,并将其用作新表中的外键呢?没有特别的原因 key 需要是值的散列,在哪里?

标签: oracle plsql oracle11g


【解决方案1】:

据我所知,没有内置的 Oracle 功能可以满足您的要求。以下是我的做法(根据需要更改变量大小/类型/分隔符)。

创建一个函数来构建唯一 ID,以便您可以根据需要重新使用它来获取这些 ID。

FUNCTION get_unique_id(val_1_in VARCHAR2, val_2_in VARCHAR2, val_3_in VARCHAR2) RETURN VARCHAR2
AS
    unique_id VARCHAR2(4000);
    delimiter_l CONSTANT VARCHAR2(1) := '|';
BEGIN
    unique_id := val_1_in || delimiter_l || val_2_in || delimiter_l || val_3_in;

    return unique_id;
END;

现在,加载您的表格。我用一个临时表对此进行了测试,它确实有效。

DECLARE
  unique_id_l VARCHAR2(4000); --consider using table_1.column_unique_id%TYPE
BEGIN
FOR rec in 
   ( --use your 3 columns here you want to make the unique value
    SELECT col_1, col_2, col_3
    FROM source_table
    GROUP BY col_1, col_2, col_3 --this GROUP BY will insure uniqueness
   )
    LOOP
        unique_id_l := get_unique_id(rec.col_1, rec.col_2, rec.col_3); --use your function to build the unique ID we want to submit into the new tables

        INSERT INTO table_1 (column_unique_id)
        VALUES (unique_id_l);
    END LOOP;

END;

【讨论】:

    【解决方案2】:

    使用 CONCAT 函数:

    DECLARE
      n1  NUMBER := 1234;
      n2  NUMBER := 567;
      n3  NUMBER := 890;
      c   VARCHAR2(2000);
    BEGIN
      c := CONCAT(CONCAT(n1, '|'), CONCAT(CONCAT(n2, '|'), CONCAT(n3, '|')));
      DBMS_OUTPUT.PUT_LINE('''' || c || '''');
    END;
    

    分享和享受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 2014-10-15
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2012-02-17
      • 2015-08-03
      相关资源
      最近更新 更多