2016-09-21 80 views
1

我有一个名为bundle_metadata的表,其中包含两列“名称”和“值”。我希望值列包含各种数据类型,具体取决于存储的元数据类型。由于缺乏更好的解决方案,我通过将其存储为varchar来解决此问题。在同一调用中投射列为不同类型

因此,例如一行可能是name: 'Price', value: '1000'和另一行:name: 'Category', value: 'Home'和第三个name: 'LocationLat', value: '55.15813'

现在的问题:

select语句然后可以是:

SELECT * FROM [bundle_metadata] WHERE (name='Price' AND value BETWEEN 200 AND 3000) OR (name='Category' AND value = 'Home') 

呼叫的两个作品本身,但是当像上述组合,我得到这个错误:

Conversion failed when converting the nvarchar value '55.158313' to data type int. 

注意:价值55.158313甚至不是从选定的行。我究竟做错了什么?

在此先感谢

+0

确定它是。您在where列中使用了'value'字段,并且mysql仍然试图将所有这些值转换为'between'调用的整数,尽管当'name ='时它应该被短路评估排除在外价格'失败。 –

+0

@MarcB这是如何工作,如果查询本身正常工作,如下所示: 'SELECT * FROM [bundle_metadata] WHERE(name ='Price'AND value BETWEEN 200 and 3000)' 只有当它与查询的后半部分。 – vocoder

回答

1

在MySQL: 使用条件 '列名> 0' 这仅返回数值

SELECT * FROM `[bundle_metadata]` WHERE (value> 0) AND (name='Price' AND cast(value AS DECIMAL(10,2)) BETWEEN 200 AND 3000) OR (name='Category' AND value = 'Home') 

在MS SQL: 使用ISNUMERIC()方法来获得其中指定的列具有唯一的数值的行。

MS SQL查询1:

SELECT * FROM [bundle_metadata] where (ISNUMERIC(value) =1 AND (name='Price' AND CONVERT(FLOAT,[value]) BETWEEN 200 AND 3000)) OR (name='Category' AND value = 'Home') 

MS SQL查询2:

SELECT * INTO #temp FROM [bundle_metadata] where ISNUMERIC(value) =1 
SELECT * INTO #final FROM #temp WHERE (name='Price' AND CONVERT(FLOAT,[value]) BETWEEN 200 AND 3000)  
INSERT INTO #final SELECT * FROM bundle_metadata WHERE (name='Category' AND value = 'Home') 
SELECT * FROM #final 

这里的解释为我的第二查询 第1行:我存储在临时表中的#TEMP过滤行这[值]栏中只有数字数据。
第2行:再次通过where name ='Price'过滤#temp表,并通过将[value]列转换为float.then并存储在#final表中来应用范围过滤。
第3行:将符合条件的行从bundle_metadata插入到#final表中,其中(name ='Category'AND value ='Home')。 第4行:通过选择#最终表格获得预期结果

+0

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文可提高其长期价值。不鼓励使用仅有代码的答案。 – Ajean

+0

@Ajean抱歉,原因不明的代码,现在我给解释 – Balan

+0

上面的MSSQL查询1完美工作。但: 如果我改变它转换为INT而不是浮动我得到了和以前一样的错误。 (ISNUMERIC(value)= 1 AND(name ='Price'AND CONVERT(INT,[value])BETWEEN 200 AND 3000))或(name ='Category'AND value ='家') INT也是一个数值,所以为什么这不起作用?价格'200'和'3000'可以作为整数,对不对? – vocoder

0

你想做的数字比较。在MySQL中,您可以使用静默转换来转换它们:

SELECT * 
FROM [bundle_metadata] 
WHERE (name = 'Price' AND value + 0.0 BETWEEN 200 AND 3000) OR 
     (name = 'Category' AND value = 'Home') 

MySQL必须为每行处理WHERE子句。所以,每一行都会被转换。它决定转换的正确类型是一个整数,并且浮点值未通过该测试。

+0

顺便说一句,为什么它也不工作?我已经定义了名称和值varchar(50)并得到此错误'算术溢出错误转换为数据类型数字的varchar。' – Susang

相关问题