如果不是数字或SQL中的实际数值,则获取null

时间:2012-11-14 12:53:24

标签: sql-server tsql isnumeric

如果isnumeric()函数返回0,我正在尝试获取字符串的数值。如果返回0,我只是得到它。但是我只得到它是数字我得到1或如果非数字则为null。 是否可以使用类似下面的代码返回数值(而不是1)?

select '14-154877-0' as actual_string, replace('14-154877-0', '-', '') as numeric_value, nullif(isnumeric(replace('14-154877-0', '-', '')), 0) as numeric_value_or_null /* Here I wold like to return the numeric value instead of 1 */

select 'some text' as actual_string, replace('some text', '-', '') as numeric_value, nullif(isnumeric(replace('some text', '-', '')), 0) as numeric_value_or_null /* OK */

示例数据

insert语句是excel连接函数的结果。

作为sugested,我使用case表达式和try_convert()(用于MSSQL 2012)函数,它们工作正常。有没有更好的方法来做这种插入?

if object_id('tempdb..#temp_table') is not null
    begin
        drop table #temp_table;
    end;

create table #temp_table (
        int_column int,
        varchar_column varchar(50)
    );

insert into #temp_table (int_column, varchar_column) values (case when isnumeric(replace('111----111', '-', '')) = 1 then replace('111----111', '-', '') end, 'string data 1');
insert into #temp_table (int_column, varchar_column) values (case when isnumeric(replace('text', '-', '')) = 1 then replace('text', '-', '') end, 'string data 2');
insert into #temp_table (int_column, varchar_column) values (try_convert(int, replace('258--', '-', '')), 'string data 3');
insert into #temp_table (int_column, varchar_column) values (try_convert(int, replace('123', '-', '')), 'string data 4');

select * from #temp_table;

/*
    |   int_column  |   varchar_column  |
    |   111111      |   string data 1   |
    |   NULL        |   string data 2   |
    |   258         |   string data 3   |
    |   123         |   string data 4   |
*/

4 个答案:

答案 0 :(得分:4)

也许:

SELECT value as actual_string
, replace(value, '-', '') as numeric_value
, CASE ISNUMERIC(replace(value, '-', ''))
  WHEN 1 THEN CAST(replace(value, '-', '') AS FLOAT)
  ELSE NULL END AS numeric_value_or_null
FROM TableName

Fiddle inside

答案 1 :(得分:3)

如果您在2012年(为您的数据选择合适的数据类型,我假设INT

SELECT TRY_CONVERT(INT, replace(value, '-', ''))

答案 2 :(得分:1)

使用案例陈述有什么问题? e.g。

declare @text varchar(50)
set @text = '747467'

select 
    case
        when isnumeric(@text) <> 1 then null
        else cast(@text as decimal)
    end as numeric_or_null

答案 3 :(得分:1)

select '14-154877-0' as actual_string, replace('14-154877-0', '-', '') as numeric_value, case when isnumeric(replace('14-154877-0', '-', ''))=1 then Cast(replace('14-154877-0', '-', '') as Numeric) else null end as numeric_value_or_null /* Here I wold like to return the numeric value instead of 1 */