Sql 将不规则字符串转换为整数

Sql 将不规则字符串转换为整数,sql,sql-server,Sql,Sql Server,现在我正在使用一个遗留数据库,其中一列(外键)是一个nVarChar,它由单元格组成,例如“23+abcde”,其中“23”是实际键,其余是某种属性(?) 所以我需要的是这样的东西: SELECT * FROM table WHERE bad_column = 23; 将“23+abc”转换为23的最佳方式是什么?试试这个- SELECT * FROM table WHERE CAST(SUBSTRING(bad_column, 1, CHARINDEX('+', bad_column))

现在我正在使用一个遗留数据库,其中一列(外键)是一个nVarChar,它由单元格组成,例如“23+abcde”,其中“23”是实际键,其余是某种属性(?)

所以我需要的是这样的东西:

SELECT * FROM table WHERE bad_column = 23;
将“23+abc”转换为23的最佳方式是什么?

试试这个-

SELECT * 
FROM table 
WHERE CAST(SUBSTRING(bad_column, 1, CHARINDEX('+', bad_column)) AS INT) = 23;
试试这个-

SELECT * 
FROM table 
WHERE CAST(SUBSTRING(bad_column, 1, CHARINDEX('+', bad_column)) AS INT) = 23;

要选择这类数据,您需要

SELECT *
FROM table
WHERE bad_column LIKE '23%';
这不是演员阵容,而是转换

SELECT substring (bad_column, 1, patindex(' ', bad_column))
FROM table
WHERE bad_column LIKE '23%';

要选择这类数据,您需要

SELECT *
FROM table
WHERE bad_column LIKE '23%';
这不是演员阵容,而是转换

SELECT substring (bad_column, 1, patindex(' ', bad_column))
FROM table
WHERE bad_column LIKE '23%';
试试这个

SELECT * from table_name
WHERE (CASE WHEN PatIndex('%[0-9]%', bad_column) > 0 
THEN CONVERT(INT,LEFT(bad_column,LEN(bad_column)-PatIndex('%[0-9]%',REVERSE(bad_column))+1))
ELSE 0 END) = 23
试试这个

SELECT * from table_name
WHERE (CASE WHEN PatIndex('%[0-9]%', bad_column) > 0 
THEN CONVERT(INT,LEFT(bad_column,LEN(bad_column)-PatIndex('%[0-9]%',REVERSE(bad_column))+1))
ELSE 0 END) = 23
试试这个,在这种情况下,
=23:

SELECT * 
FROM TABLE 
WHERE SUBSTRING(bad_column,1,LEN(<key>)) NOT LIKE '[a-zA-Z]'
AND SUBSTRING(bad_column,1,LEN(<key>)) = <key>
选择*
从桌子上
其中子字符串(bad_列,1,LEN())与“[a-zA-Z]”不同
和子字符串(坏列,1,LEN())=
通过这种方式,在比较时不需要强制转换(
NOT LIKE
子句避免了文本,您必须提供其他chars规则),并且确保只保留正好包含键的列

编辑:您也不需要
CHARINDEX
规范。

试试这个,在这种情况下,
=23:

SELECT * 
FROM TABLE 
WHERE SUBSTRING(bad_column,1,LEN(<key>)) NOT LIKE '[a-zA-Z]'
AND SUBSTRING(bad_column,1,LEN(<key>)) = <key>
选择*
从桌子上
其中子字符串(bad_列,1,LEN())与“[a-zA-Z]”不同
和子字符串(坏列,1,LEN())=
通过这种方式,在比较时不需要强制转换(
NOT LIKE
子句避免了文本,您必须提供其他chars规则),并且确保只保留正好包含键的列


编辑:您也不需要
CHARINDEX
规范。

这不起作用。它返回以23开头的键的不同行(23、230、2309等)。如果数字后面总是有空格,请使用
如“23%”
,以防止Barabba描述的情况。这将不起作用。它会为以23开头的键返回不同的行(23、230、2309等)。如果数字后面总是有空格,请使用
如“23%”
,以防止Barabba描述的情况。是否可以更改该表并仅为该键int添加一列?需要在
中使用表达式的选择,其中
相当慢。如果有一个额外的列,你只需要计算一次。好吧,这是一个选项,但我不允许接触结构。你能改变那个表并为那个键int添加一个列吗?需要在
中使用表达式的选择,其中
相当慢。如果有一个额外的列,你只需要计算一次。好吧,这是一个选项,但我不允许接触结构。这是我的情况下最合适的解决方案。如果字符串中没有“+”怎么办?据我所知,bad_列是一个合成键。所以我假设符号总是在这个字符串中。在另一种情况下:选择CAST(子字符串('56678',1,CHARINDEX(+','56678')作为INT)返回零。同意您的评论。但是,最初请求使用字符串格式,类似于“23+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。所以我假设符号总是在这个字符串中。在另一种情况下:选择CAST(子字符串('56678',1,CHARINDEX(+','56678')作为INT)返回零。同意您的评论。但是,最初要求使用字符串格式,类似于'23+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,这是德瓦特提议的。