13

タイプに関係なく、指定されたすべての行をmd5()するSQLクエリ(またはplpgsql)を作成したいと思います。ただし、以下では、1つがnullの場合、ハッシュはnullになります。

UPDATE thetable 
    SET hash = md5(accountid || accounttype || createdby || editedby);

後でハッシュを使用して一意性を比較しているため、このユースケースではnullハッシュは機能しません。

問題は、nullの連結を処理する方法でした。例えば:

thedatabase=# SELECT accountid || accounttype || createdby  || editedby 
                 FROM thetable LIMIT 5;  

1Type113225  
<NULL>
2Type11751222 
3Type10651010 
4Type10651

タイプがわかっていれば、colesceまたはCASEステートメントを使用できます。ただし、テーブルがたくさんあるので、すべての列のタイプを事前に知ることはできません。

4

4 に答える 4

46

これには、はるかに洗練されたソリューションがあります。

Postgresでは、でテーブル名を使用するSELECTことが許可されており、タイプはROWです。これをtypeTEXTにキャストすると、実際にはJSONである文字列に連結されたすべての列が得られます。

md5これにより、次のようにすべての列を取得できます。

SELECT md5(mytable::TEXT)
FROM mytable

一部の列のみを使用する場合は、ROWコンストラクターを使用して次の場所にキャストしTEXTます。

SELECT md5(ROW(col1, col2, col3)::TEXT)
FROM mytable

このソリューションのもう1つの優れた特性は、空の文字列md5とは異なることです。NULL

必須のSQLFiddle 。

于 2013-01-29T06:02:10.367 に答える
5

mvpのソリューションに似たものを使用することもできます。Amazon RedshiftでサポートされていないROW()関数を使用する代わりに...

無効な操作:暗黙的または明示的なROW式は、ターゲットリストではサポートされていません。

私の提案は、ドキュメントによると、このタイプがすべてのRedshiftデータ型と互換性がある限り、NVL2およびCAST関数を使用して異なるタイプの列をCHARにキャストすることです。以下に、RedshiftでヌルプルーフMD5を実現する方法の例を示します。

SELECT md5(NVL2(col1,col1::char,''), 
           NVL2(col2,col2::char,''), 
           NVL2(col3,col3::char,''))
FROM mytable

これは、2番目のNVL2関数の引数をcharにキャストしなくても機能する可能性がありますが、null値の日付列からmd5を取得しようとすると、間違いなく失敗します。これが誰かに役立つことを願っています。

于 2016-01-06T16:45:03.250 に答える
2

CONCAT()を使ってみましたか?PG9.1のインストールを試しました。

SELECT CONCAT('aaaa',1111,'bbbb');     => aaaa1111bbbb
SELECT CONCAT('aaaa',null,'bbbb');     => aaaabbbb

したがって、次のことを試すことができます。

SELECT MD5(CONCAT(column1, column2, column3, column_n))    => md5_hash string here
于 2013-01-29T05:23:11.723 に答える
0

FY_cfop as pからMD5(cast(p as text))を選択します

于 2020-04-27T03:56:04.863 に答える