簡體   English   中英

在 where 子句中使用帶有數值的 Varchar2 列進行更新有時適用於數值,但有時會給出無效數字錯誤

[英]Update with Varchar2 column with numeric values in where clause sometimes works with numeric values but sometimes gives invalid number error

假設以下數據是 A 是數字而不是主鍵 B 是具有數值的 varchar2:

桌子

1

以下更新語句有效:

更新表集 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM