【问题标题】:T-SQL find only the columns which can be casted as INTT-SQL 只查找可以转换为 INT 的列
【发布时间】:2015-03-16 14:25:09
【问题描述】:

我需要编写一个 SELECT 语句,它有一个 WHERE 子句,其中只选择可以 CAST 为 INT 的行,而不是 BIGINT,而是 INT。

这可能吗

我使用的是 SQL Server 20**

现在我正在做这样的事情:

SELECT CAST(column as INT) FROM TABLE
WHERE ISNUMERIC(column) = 1

然后我得到'varchar 值'275949275947'的转换溢出了一个 int 列'

列中有很多不同的数据 - 但我只需要 INT

【问题讨论】:

  • 可以把你的表结构放在这里。
  • 哪个** 是你的实际目标版本,我问是因为2012 年引入了TRY_PARSE,这正是你想要的。
  • 标题表示列,问题表示行。是哪个?

标签: sql casting int


【解决方案1】:

SQL Server 2012:

select try_parse('1231321313' as int)
select try_parse('234242342341231321' as int)

SQL Server

select  case when ISNUMERIC('1231321313') = 1 
                and patindex('%[^0-9-]%', '1231321313') = 0
                and cast('1231321313' as bigint) between -2147483648 and 2147483647
                then cast('1231321313' as int) end

select  case when ISNUMERIC('234242342341231321') = 1
                and cast('234242342341231321' as bigint) between -2147483648 and 2147483647
                then cast('234242342341231321' as int) end

编辑:要处理潜在的货币价值(“$23424231321”、“€23424231321”等),您还可以添加patindex('%[^0-9-]%', '1231321313') = 0

【讨论】:

  • 试试 '$234242342341231321'
  • $234242342341231321 使用上面的代码计算为 null
  • 然后试试 $23424231321 :)
  • 该死我在 sql
  • 令我惊讶的是,您找到了一个可以通过ISNUMERICPATINDEX 测试但在CAST 上失败的案例。能举个具体的例子吗?
【解决方案2】:
DECLARE @Table TABLE (
    [column] VARCHAR(200)
)

INSERT INTO @Table SELECT '1'
INSERT INTO @Table SELECT '154674'
INSERT INTO @Table SELECT '-2147483649'
INSERT INTO @Table SELECT '2147483648'

SELECT CAST([column] as INT) FROM @TABLE
WHERE ISNUMERIC([column]) = 1
AND CAST([column] as BIGINT)>=-2147483648
AND CAST([column] as BIGINT)<=2147483647

【讨论】:

    【解决方案3】:

    这将适用于 MS SQL 2012+:

    DECLARE @t TABLE ( A INT, B NVARCHAR(50) )
    
    INSERT  INTO @t
    VALUES  ( 1, '1' ),
            ( 2, '275949275947' ),
            ( 2, 'cc' )
    
    
    SELECT  CAST(B AS INT) AS B
    FROM    @t
    WHERE   TRY_PARSE(
            B AS INT) IS NOT NULL
    

    输出:

    B
    1
    

    【讨论】:

    • 看起来不错 - 但仍然出现错误“将 varchar 值 '2567953' 转换为数据类型 int 时转换失败。”看起来他们是该领域的换行符
    • @user2199192,可能是的。您可以通过以下方式进行检查:SELECT * FROM @t WHERE B LIKE N'%' + CHAR(10) + '%' OR B LIKE N'%' + CHAR(13) + '%'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多