sql - 如何将多个 varchar 值转换为 smallint
问题描述
对不起,我一直在努力寻找答案,但论坛中的大多数问题都与转换一个值有关,而不是整个集合。
我正在尝试将子查询值传递给主查询,但子查询返回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”,我想将所有值转换为SmallInt
或int
将其传递给主查询。
select AT_NUMBERS
from ACTIVITY
where AT_ID = 105
解决方案
请尝试嵌套铸造,如:
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)
推荐阅读
- javascript - “必须返回一个有效的 React 元素(或 null)。” 与 array.map
- python - 当太多行传递给 sess.run 时,Tensorflow SEGMENTATION FAULT
- python - 从 numpy 结构化数组中的数据打印行
- javascript - JavaScript 中的 Firebase 云消息传递 AJAX POST
- postgresql - 想要以增量方式混淆数据库中的数据
- sql - 从表内连接中删除行
- python - (Python)字典不识别键
- python - 使用 PyJWT 解码和验证 Base64urlUInt 编码的 Google 公钥
- asp.net - ASP.NET Web.config URL 重写正则表达式
- javascript - Yeoman Generator - 如何解析 Generator 项目的 Package.json