2017-07-27 134 views
0

我是SQL新手,並且有一個由數字和文本組成的字符串的表(例如,「10 Windows」) 。從這個表中,我需要從字符串中提取出「10」,並將其作爲整數移動到一個新列中(我使用的是pgAdmin4)如何在使用CAST和SUBSTRING時過濾postgresql中的查詢結果(pgAdmin 4)

我能夠編寫一個查詢來解析出數字該字符串並將它們作爲整數返回到新列。

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 

從這裏,我可以從data1中的字符串中獲取數字,將其作爲data1_num列作爲整數。

但是,如果我想過濾找到所有行,其中data1_num = 27,通過下面的查詢,我得到一個錯誤。

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 
WHERE data1_num = 27 

錯誤:

ERROR: column "data1_num" does not exist 
LINE 3: WHERE data1_num = 27 
     ^
********** Error ********** 

ERROR: column "data1_num" does not exist 
SQL state: 42703 
Character: 205 

我這麼想嗎?

我覺得這應該工作,即使data1_num是27的零行,我也不應該得到一個錯誤。

回答

0

由於在postgresql中解析查詢的方式,您會收到錯誤消息。首先檢查where條件,然後按語句排序(如果有的話),然後最後選擇列列表。所以postgres無法識別別名。

我覺得這會給你想要的結果:

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 
WHERE SUBSTRING(data1 FROM '(\d+)') = '27' 
0

這不會因爲列「data1_num」是一個虛擬列,如果你想要得到的結果,那麼你必須寫同樣的鑄造工作where子句中的邏輯。

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 
WHERE CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) = 27 
0

即使你SELECT條款首次出現在查詢中,它實際上是WHERE條款後評估。這是標準的SQL。這意味着您無法訪問您的SELECT上的計算列(或列別名)。

就試試這個:

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 
WHERE CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) = 27 ; 

注意:不要擔心被計算兩次表達式。這是由數據庫來優化的。

如果你還是擔心,您可以使用此:

SELECT 
    * 
FROM 
    (
     SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
     FROM events 
    ) AS q 
WHERE data1_num = 27 ; 

參考文獻: