在整數列的 WHERE 子句中加上引號會產生什麼後果?
我有一個包含
some_column
數據類型列的表integer
。我注意到我的 PostgreSQL 10.6 實例足夠聰明,可以將以下兩個查詢解釋為相同:
select * from my_table where some_column = 5; -- no quotes select * from my_table where some_column = '5'; -- quotes added
where
在列的子句中添加引號會產生什麼影響integer
?它會對包含 2000 萬行的大表產生性能影響嗎?
(有一個索引
some_column
。)
兩者都做同樣的事情,您將無法衡量性能的任何差異。
細節
這是一個字元串文字或字元串常量:
'5'
SQL 中的字元串常量是由單引號 ( ) 包圍的任意字元序列
'
,例如'This is a string'
。要在字元串常量中包含單引號字元,請寫入兩個相鄰的單引號,例如'Dianne''s horse'
. 請注意,這與雙引號字元 ("
) 不同。如果沒有可以派生類型的上下文,則字元串文字最初被假定為 type
text
。(在您的範例中不是這種情況。)如果常量必須是的類型沒有歧義(例如,當它直接分配給表列時),則可以省略顯式類型轉換,在這種情況下,它會自動強制轉換。
這是一個數字文字或數字常量:
5
手冊:
一個既不包含小數點也不包含指數的數字常量
integer
如果其值適合類型integer
(32 位),則最初假定它是類型;否則,bigint
如果它的值適合類型bigint
(64 位),則假定它是類型;否則它被認為是 typenumeric
。包含小數點和/或指數的常量最初總是假定為 typenumeric
。因此,數字文字以特定類型開始。然後可以根據上下文需要將其轉換為不同的類型 -如果定義了這樣的轉換。這是一個微妙但重要的區別 - 在您的情況下沒有有效的區別,因為
5
is initialinteger
,這正是它需要的類型。但這在其他情況下很重要。試試這個:
CREATE TEMP TABLE tbl1 (t int); SELECT * FROM tbl1 where t = '0'; -- works! SELECT * FROM tbl1 where t = int '0'; -- works! SELECT * FROM tbl1 where t = int2 '0'; -- works! SELECT * FROM tbl1 where t = 0; -- works! CREATE TEMP TABLE tbl2 (t text); SELECT * FROM tbl2 where t = '0'; -- works SELECT * FROM tbl2 where t = text '0'; -- works SELECT * FROM tbl2 where t = varchar '0'; -- works SELECT * FROM tbl2 where t = 0; -- fails !!!
ERROR: operator does not exist: text = integer
因為數字文字開始於
integer
並且沒有為integer
–>定義的賦值轉換text
。(任何類型都可以通過text
顯式強制轉換 (0::text
) 進行強制轉換,但此處不假定該強制轉換。)