我遍历了所有“从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时转换失败。”
任何帮助将不胜感激。
答案 0 :(得分:1)
您可以通过避免使用CASE
和Regex
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
答案 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)