sql >> データベース >  >> RDS >> Oracle

Oracle番号とvarcharが結合します

    暗黙的な変換が失敗する理由の1つは、結合するvarchar列に数値ではないデータが含まれている場合です。 Oracleは、文字列を変換することによって数値をvarchar2結合に処理するため(Garyのコメントの引用を確認してください)、実際にこれを実行します:

    select a.col1, b.somecol 
    from tableA a inner join tableB b on to_number(b.col2)=a.col1;
    

    tableB.col2に数値ではない値が含まれている場合(可能性が非常に高いと思われますが、結局は文字列です)、ORA-01722: invalid numberがスローされます。 。数値列を文字列に明示的にキャストすることにより、Oracleのデフォルトの動作を短絡させます。

    最初の2つの環境でこの問題が発生しないという事実は、構成ではなく運の問題です。クエリを分割するために必要な非数値文字列は1つだけなので、いつでも攻撃される可能性があります。したがって、実際には、すべての環境で明示的な変換を使用して実行する必要があります。

    パフォーマンスに関しては、関数ベースのインデックスを作成できます...

    create index whatever_idx on tableA ( to_char(col1) )
    / 
    



    1. OracleSQLで1970UTC以降のミリ秒のタイムスタンプを取得するにはどうすればよいですか?

    2. 選択に挿入し、単一のクエリで更新します

    3. MySQLデータ列に64kBのデータしか保存されないのはなぜですか?

    4. @row:[email protected]+1に相当するphpとは何ですか