2014-09-04 4 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 будет завершено до того, как я произнесет или я ошибаюсь (очевидно)?

Edit:

Продолжительность:

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 с, поэтому тот факт, что вы бросаете их на выбор, никак не повлияет на выражение объединения. Вы правы, однако, когда говорите, что 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' будут все отчеты как числовые, но вы не смогут преобразовать их в INT или DECIMAL

Вместо этого попробуйте следующее:

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

Nice объяснение на блоге. –