2014-09-04 72 views
0

加入我有一個看起來像這樣一個數據庫:(以及幾乎; P)T-SQL與ISNUMERIC

TABLE1

COL1 int (pk) 
COL2 bit 
COL3 int (FK to TABLE2 COL4) 

TABLE2

COL4 int (pk) 
COL5 varchar(50) 

根據比特值,表2中包含的數據將是數字或不是數字(1是數字)。

如果我運行此查詢:

SELECT 
    CAST(COL5 AS INT) 
FROM 
    TABLE1 
INNER JOIN 
    TABLE2 ON COL4 = COL3 AND COL2 = 1 AND ISNUMERIC(COL5) 

我得到一個轉換失敗錯誤:

Conversion failed when converting the varchar value '£0.00' to data type int

查詢,不投,不返回此值,儘管 '0.00£'在桌子上。

我的印象是ON條件會在演員完成之前完成,還是我錯了(顯然)?

編輯:

運行:

SELECT CASE WHEN COL5 LIKE '%[^0-9]%' THEN -1 
      WHEN CAST(COL5 as bigint) > 2147483647 THEN -1 
      ELSE cast(COL5 as int) END 
FROM TABLE1 
INNER JOIN TABLE2 
    ON COL4 = COL3 AND COL2 = 1 

執行,並沒有返回-1

回答

0

SELECT部分表達什麼都沒有做與那些在JOIN S,這樣的事實,你在選擇時施放它們不會以任何方式影響連接表達式。但是,當您說ON事情在SELECT列表之前完成時,您是正確的。

由於兩個COL5調用是不同的,不相關的,你必須重複投:

SELECT cast(COL5 as int) 
FROM TABLE1 
INNER JOIN TABLE2 ON COL4 = COL3 AND 
        COL2 = 1 AND 
        ISNUMERIC(CAST(COL5 AS INT)) 
3

其實這是一個問題與ISNUMERIC()

事情是這樣:'$0.00', '£0.00', '1e10' 將所有報告的數字,但你將無法將它們轉換爲INTDECIMAL

請嘗試以下操作:

SELECT CAST(CAST(COL5 as money) as int) 
FROM TABLE1 
INNER JOIN TABLE2 ON COL4 = COL3 AND COL2 = 1 AND ISNUMERIC(COL5) 

我對問題的博客新聞與ISNUMERIC()http://www.thatcoderguy.co.uk/2014/04/07/the-problem-with-isnumeric/

+0

尼斯解釋在博客上。 – 2016-03-13 10:24:43