【问题标题】:How to convert multiple varchar values into smallint如何将多个 varchar 值转换为 smallint
【发布时间】:2018-11-12 03:02:21
【问题描述】:

对不起,我一直在努力寻找答案,但论坛中的大多数问题都与转换一个值有关,而不是整个集合。

我正在尝试将子查询值传递给主查询,但子查询返回 varchar 并且主查询列正在接受 smallint。我尝试了投射和转换,但没有帮助。

select time_off_type_no 
from schedtime 
where activity_no in (select AT_NUMBERS from ACTIVITY where AT_ID = 105)

此查询引发以下异常

将 varchar 值 '483,484,485,486,487,488,489' 转换为数据类型 smallint 时转换失败

任何关于如何转换值的建议都非常感谢。

以下查询返回“483,484,485,486,487,488,489”,我想将所有值转换为 SmallIntint 以将其传递给主查询。

select AT_NUMBERS 
from ACTIVITY 
where AT_ID = 105

【问题讨论】:

  • 搜索以逗号分隔的列表为多个值
  • @MatBailie,我只想要 '483,484,485,486,487,488,489' 到 483,484,485,486,487,488,489,因为我在主查询中将此值作为 int 传递,例如“where activity_no in (483,484,485,486,487,48)”
  • 是的,你必须把那个 SINGLE STRING 变成许多整数的列表......
  • 谢谢大家,正如你们建议的那样,我将字符串传递给函数并拆分值并将所有值返回为 int,效果很好

标签: sql sql-server


【解决方案1】:

请尝试嵌套转换,如:

SELECT CAST(CAST(AT_NUMBERS AS DECIMAL) AS SMALLINT) from ACTIVITY where AT_ID=105

编辑:由于返回的值是逗号分隔的字符串,我认为如果 SQL Server 的版本至少为 2016,这将有所帮助

;with cte (ID) as (
  Select string_split (AT_NUMBERS,',') as ID
  from ACTIVITY
  where AT_ID=105
)
select time_off_type_no from schedtime where activity_no in (
   SELECT CAST(CAST(ID AS DECIMAL) AS SMALLINT) from cte
)

如果 SQL SERVER 版本低于 2016,我们需要开发自己的拆分功能。您可以在How to split a comma-separated value to columns 中找到示例

如果是这样,试试这个作为例子,在 Sql Server 2008 中工作:

DECLARE @t TABLE
(
EmployeeID INT,
Certs VARCHAR(8000)
)
INSERT @t VALUES (1,'B.E.,MCA, MCDBA, PGDCA'), (2,'M.Com.,B.Sc.'), (3,'M.Sc.,M.Tech.')


SELECT EmployeeID,
LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Certs
FROM
(
SELECT EmployeeID,CAST('<XMLRoot><RowData>' + REPLACE(Certs,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM   @t
)t
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)

参考:https://blog.sqlauthority.com/2015/04/21/sql-server-split-comma-separated-list-without-using-a-function/

【讨论】:

  • 你真的应该为你的 decimal 数据类型声明你的规模和精度。
  • 这是一个逗号分隔的列表,这无济于事。
  • @MatBailie,没错,它是逗号分隔列表。
  • @Eray Balkanli,它没有帮助,因为它是一个逗号分隔的列表。如果它在前端,我可以转换,但我不确定 sql server 端的最佳实践是什么
  • @Eray Balkanli,我正在使用 SLQ 2012,你知道我需要使用哪个拆分功能来使用你的 Ref 吗?
【解决方案2】:

如果这些 (483,484,485,486,487,488,489) 是单独的数字,我认为您需要用逗号分隔字符串。如果这是整数值,那么即使是 Big Int 限制也不是这样。

参见 MS 文档:

https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql?view=sql-server-2017

如果你的 SQL server 版本大于 2016 或者更高,那么你可以通过这种方式使用 string_split 函数。

--使用 try_cast 或 Try_convert 也可以避免任何转换错误。

select Try_cast(value as int) Integervalue  from  string_split ('483,484,485,486,487,488,489',',') 

输出:

Integervalue
483
484
485
486
487
488
489

--如果它是纯整数值,这将起作用,否则它需要转换为十进制。

如果您对表格使用,请确保使用交叉应用。

如果小于 2016,您可能需要构建一个字符串拆分功能,如此处所述。

Splitting the string in sql server

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2016-10-07
    • 2013-12-08
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多