【问题标题】:SQL Cast in select based on valueSQL Cast in select based on value
【发布时间】:2015-04-16 17:28:05
【问题描述】:

有没有办法根据它是否为数字来在 select 语句中转换 nvarchar 字段。我目前有这段代码,但由于某种原因它正在尝试转换其中一个非数值。

  SELECT id,
  CASE WHEN ISNUMERIC(field) = 1 THEN CAST(field AS INT) ELSE CAST(field AS NVARCHAR(10)) END AS [fieldName]
  FROM table1

【问题讨论】:

  • SQL 中的列具有数据类型。您不能在同一列中混合数据类型。也许您可以做的是使用 SQL_VARIANT 列(只​​是想)
  • 很遗憾,答案是否定的。您的查询返回具有单一数据类型的单列。要求 SQL Server 为单个列返回两种不同的数据类型就像要求一辆四轮驱动摩托车。
  • 还有其他选择,例如将值转换为特定格式的数字,然后将其转换回 nvarchar 值 - 您能描述一下您要在这里完成的工作吗?也许还有另一种方法可以解决这个问题。
  • 我将值放入 VB 中的 datagridview 中,并希望它在单击 datagridview 的列标题时正确排序数字,升序或降序

标签: sql sql-server select casting numeric


【解决方案1】:

如果你用零填充数值的左边,它会正确排序吗?如下所示?

DECLARE @Table1 TABLE (Field NVARCHAR(10))

INSERT INTO @Table1 (Field) VALUES (1)
INSERT INTO @Table1 (Field) VALUES (10)
INSERT INTO @Table1 (Field) VALUES (100)
INSERT INTO @Table1 (Field) VALUES (2)
INSERT INTO @Table1 (Field) VALUES ('abv')

SELECT 
    Field,
    CASE 
        WHEN ISNUMERIC(Field) = 1 
        THEN RIGHT('000000000' + Field,10) 
        ELSE Field 
     END AS SortField
FROM @Table1
ORDER BY SortField DESC

SELECT 
    Field,
    CASE 
        WHEN ISNUMERIC(Field) = 1 
        THEN RIGHT('000000000' + Field,10) 
        ELSE Field 
     END AS SortField
FROM @Table1
ORDER BY SortField ASC

【讨论】:

  • 有效,但在 datagridview 中看起来很乱。是否有隐藏一些零以仅显示最后 34 个字符?
  • 您可以使用RIGHT('000000000' + Field,10) 部分设置长度 - 将零的数量更改为您需要的任何值,将 10 更改为您想要的数字。
  • 成功了,谢谢!只是好奇,填充 0 是如何对字符串进行排序的,就好像它们是整数一样?
  • 文本排序不同于数字排序...文本从第一个字符开始,然后到第二个字符,依此类推。因此,由于 1 低于 2,因此任何带有 1 的字符都会出现出现在 2 之前,不管它后面有多少个零。 (例如,1、1000、2)。这与文本值的工作方式相同;如果你看到 azzzzzzzz,它总是会出现在 b 之前。但是,如果第一个字符是零,那显然在一个之前,所以它会适当地对它进行存储(例如,0001、0002、1000)。
猜你喜欢
  • 2020-06-12
  • 2022-12-19
  • 2022-12-02
  • 2022-12-02
  • 2022-11-20
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2022-12-02
相关资源
最近更新 更多