![](/img/trans.png)
[英]select from varchar2 column with numeric value sometimes gives invalid number error
[英]Update with Varchar2 column with numeric values in where clause sometimes works with numeric values but sometimes gives invalid number error
假設以下數據是 A 是數字而不是主鍵 B 是具有數值的 varchar2:
桌子
以下更新語句有效:
更新表集 columnA = 12340 其中 ColumnB = 98761
盡管 B 是 varchar,但它可以在沒有任何引號的情況下工作,例如 '98761'。
當我試圖扭轉這樣的變化時:
更新表集 columnA = 23450 其中 ColumnB = 98761
這給出了無效的數字錯誤。 當我將 B 列括在引號中時
更新表集 columnA = 23450 其中 ColumnB = '98761'
由於它是 varchar2,因此更新應該可以正常工作。
我的問題是我無法弄清楚為什么第一種情況有效,即使值為 varchar2 也沒有任何引號。 由於導致錯誤的列是 B,為什么在一種情況下只發生隱式轉換。
Oracle 隱式轉換和比較規則非常復雜。 你可以在這里找到一些關於它的東西:
https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements002.htm https://support.oracle.com/knowledge/Oracle%20Database%20Products/423181_1.html
最好的方法可能是確保您使用原始類型管理數據。 這意味着您的更新應如下所示:
Update Table Set columnA = '23450' Where ColumnB = '98761'
依賴隱式轉換(尤其是日期/日期時間)取決於太多的事情(對我來說)以確保它會按預期工作。 問候...
添加
上面第一個鏈接的部分解釋:
隱式和顯式數據轉換
Oracle 建議您指定顯式轉換,而不是依賴隱式或自動轉換,原因如下:
當您使用顯式數據類型轉換函數時,SQL 語句更容易理解。
隱式數據類型轉換會對性能產生負面影響,尤其是在將列值的數據類型轉換為常量而不是相反時。
隱式轉換取決於它發生的上下文,並且可能不會在每種情況下都以相同的方式工作。 例如,從日期時間值到 VARCHAR2 值的隱式轉換可能會返回意外年份,具體取決於 NLS_DATE_FORMAT 參數的值。
隱式轉換的算法會隨着軟件版本和 Oracle 產品的變化而變化。 顯式轉換的行為更可預測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.