SQL: Как использовать case и приведение в запросе? - PullRequest
2 голосов
/ 13 апреля 2011

Я хочу привести VARCHAR к INT, но в моей таблице есть какое-то значение типа '???' затем SQL Server запустит это исключение:

Conversion failed when converting the varchar value '????' to data type int.
Severity 16

Я мог бы преобразовать это '???' NULL, это не проблема, но как это сделать?

Я пытаюсь сделать что-то вроде этого:

INSERT INTO labbd11..movie(title, year)
SELECT movies.title, 
       CASE movies.mvyear IS '????' THEN NULL ELSE CAST (movies.mvyear AS INT)
FROM disciplinabd..movies

Но ничего не работает ..

Есть идеи, ребята?

Ответы [ 5 ]

8 голосов
/ 13 апреля 2011

Возможно, вы просто захотите решить эту проблему в целом и обращаться с любыми значениями не-int таким же образом

 INSERT INTO labbd11..movie(title, year) 
    SELECT movies.title, 
           CASE WHEN IsNumeric(movies.mvyear+ '.0e0') <> 1  THEN NULL 
                ELSE CAST (movies.mvyear AS INT) END  
      FROM disciplinabd..movies

Смотрите этот вопрос

3 голосов
/ 13 апреля 2011

Полагаю, вам нужно что-то вроде

INSERT INTO labbd11..movie(title, year) 
  SELECT movies.title, 
         CAST( CASE movies.mvyear 
                    WHEN '????' THEN NULL 
                    ELSE movies.mvyear
                 END AS INT) 
    FROM disciplinabd..movies

Вы хотите, чтобы ваш оператор CASE возвращал VARCHAR (либо MVYEAR, либо NULL), а затем вы хотите, чтобы CAST работал с результатомСЛУЧАЙ.

0 голосов
/ 13 апреля 2011

Вы также можете использовать:

CAST(NULLIF(movies.mvyear,'????') AS INT)
0 голосов
/ 13 апреля 2011
INSERT INTO labbd11..movie(title, year)
    SELECT
        movies.title,
        CAST(CASE WHEN movies.mvyear = '????' THEN NULL ELSE movies.mvyear END AS INT)
    FROM
        disciplinabd..movies
0 голосов
/ 13 апреля 2011
    INSERT INTO labbd11..movie(title, year) 
    SELECT movies.title, 
           CASE WHEN movies.mvyear = '????' THEN NULL 
                ELSE CAST (movies.mvyear AS INT) END  
      FROM disciplinabd..movies
...