我在玩SQL。 AdventureWorks2012数据库,表:Production.Products。
我试图获得color
黑色的产品:或者weight
为空,或者size
和listPrice
高于某个值。
这是查询
SELECT *
FROM AdventureWorks2012.Production.Product
WHERE (Color = 'Black')
AND ((ListPrice > 300 AND Size > 60) OR Weight IS NULL)
但这是我得到的错误
转换nvarchar值时转换失败' S'数据类型int。
任何人都可以澄清我做错了吗?
答案 0 :(得分:2)
Size
是nvarchar(5)
,因此您的S来自哪里。
答案 1 :(得分:1)
错误说明一切,您的列(ListPrice或Size)包含一个值为'S',并且您尝试对列执行数字比较操作(>),这会导致错误。
答案 2 :(得分:1)
尺寸='S'表示'小'?您知道“Size”列使用的数据类型是什么?如果它是单个字符,如S表示小而L表示大,则无法将其与整数进行比较。
答案 3 :(得分:1)
Size > 60
这是一个数字比较。查询引擎将尝试将Size
的每个值转换为与60
相同的类型,这是一个整数。尝试:
Size > '60'
但是,当然,这是一个字母数字比较,因此它将是字符串'60'
之后按字母顺序排列的字符串。您可能需要使用TRY_CAST()
或TRY_CONVERT()
。
答案 4 :(得分:0)
也许使用Try_Convert()。这将为无效转换返回NULL
SELECT * FROM Production.Product
WHERE (Color = 'Black')
AND ((ListPrice > 300 AND try_convert(int,Size) > 60) OR Weight IS NULL)
答案 5 :(得分:0)
我认为“大小”列的数据类似S,L,M,XL
,因此数据转换失败。由于您正在寻找值> 60
,因此int是更高的总统数据类型,sql server会尝试将S,L,M,XL
值转换为Int,从而导致错误。
更容易修复:而不是使用60
使用包含值'60'
的字符串作为列大小。
像...一样的东西。
SELECT *
FROM AdventureWorks2012.Production.Product
WHERE (Color = 'Black')
AND ( (ListPrice > 300 AND Size > '60')
OR [Weight] IS NULL)