Postgresql

在整數列的 WHERE 子句中加上引號會產生什麼後果?

  • May 25, 2019

我有一個包含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 位),則假定它是類型;否則它被認為是 type numeric。包含小數點和/或指數的常量最初總是假定為 type numeric

因此,數字文字以特定類型開始。然後可以根據上下文需要將其轉換為不同的類型 -如果定義了這樣的轉換。這是一個微妙但重要的區別 - 在您的情況下沒有有效的區別,因為5is initial integer,這正是它需要的類型。

但這在其他情況下很重要。試試這個:

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) 進行強制轉換,但此處不假定該強制轉換。)

引用自:https://dba.stackexchange.com/questions/238983