将varchar转换为int(奇怪的情况?)

时间:2018-08-01 23:39:54

标签: sql sql-server

我遍历了所有“从Varchar到Int”的帖子,但是似乎找不到任何遇到此问题的人(尽管我对SQL还是很陌生,所以我可能做的是根本错误的事情):

    SELECT *
    FROM [TABLE]
    WHERE CONVERT(INT,
        CASE
        WHEN NOT CONVERT(VARCHAR(12), dept_code) LIKE '%[^0-9]%' THEN 8900 
        END) < 9000;

这是一个相当简单的查询,目标是过滤掉“ dept_code”字段中的所有值,以便仅保留小于9000的全数字值; varchars和非数字值可以保留。运行上述时,我仍然收到错误“将varchar值'E103'转换为数据类型int时转换失败。”

任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:1)

您可以通过避免使用CASERegex like表达式来简化此查询。您可以使用IsNumeric函数过滤数字行,然后通过将过滤后的行的dept_code转换为int来应用条件,如下所示-

select * from tablex 
where ISNUMERIC(dept_code) = 0 --alphanumeric code
OR(ISNUMERIC(dept_code) = 1 and Convert(int, dept_code) < 9000) -- numeric less than 9000

Example here

答案 1 :(得分:1)

使用try_convert()try_cast()

SELECT t.*
FROM [TABLE] t
WHERE TRY_CONVERT(int, dept_code) < 9000

如果要加快此查询的速度,可以实现计算列并添加索引:

alter table [table] add dept_code_int as (try_convert(int, dept_code)) persisted;

create index idx_table_dept_code_int on [table](dept_code_int);

答案 2 :(得分:0)

您的case语句中缺少其他内容...其次,您的数字dept_codes变得非常大了……这件事会扼住它。

SELECT *
FROM [TABLE]
WHERE CONVERT(INT,
    CASE
    WHEN NOT CONVERT(VARCHAR(12), dept_code) LIKE '%[^0-9]%' THEN 8900   ELSE dept_code 
    END) < 9000;

答案 3 :(得分:0)

尝试一下:http://sqlfiddle.com/#!18/bb6b7/17

;WITH TABLE_ENHANCED AS
(
  SELECT 
    t.*
  , dept_code_numeric =
      CASE
      WHEN CONVERT(VARCHAR(12), dept_code) NOT LIKE '%[^0-9]%' 
      THEN CONVERT(INT, dept_code)
      ELSE 0 
      END
  FROM [TABLE] t
)
SELECT 
  * 
FROM TABLE_ENHANCED
WHERE dept_code_numeric < 9000

答案 4 :(得分:0)

尝试以下脚本

SELECT *
    FROM [TABLE]
    WHERE isnumeric(dept_code)=1 
and dept_code<9000;

答案 5 :(得分:0)

这应该有效。转换为int是隐式的。

SELECT *
FROM test
WHERE (ISNUMERIC(dept_code)=1 and dept_code<9000)
or (ISNUMERIC(dept_code) = 0)