使用子字符串后,mysql quert中出现多个警告

时间:2019-04-14 15:56:34

标签: mysql substring

我有一个简单的EAV之类的数据库,其中有3个表:产品,属性,attribute_values。

我正在使用下面的代码来查找所有具有“长度”属性的产品,然后我使用子字符串函数来摆脱“英寸”,此后,我使用之间的方法来获取所有“长度”在0之间的产品和5。

SELECT products.name,products.id
FROM products
JOIN attribute_value_product on products.id = attribute_value_product.product_id
JOIN attribute_values on attribute_value_product.attribute_value_id = attribute_values.id
JOIN attributes on attribute_values.attribute_id = attributes.id AND attributes.name = 'length'
WHERE substring_index(attribute_values.value,'inch',1) + 0 BETWEEN 0 AND 5

一切正常,但是我收到很多警告:

Warning: #1292 Truncated incorrect DOUBLE value: 'black'    
Warning: #1292 Truncated incorrect DOUBLE value: 'phat farm'    
Warning: #1292 Truncated incorrect DOUBLE value: '2 kg'    
Warning: #1292 Truncated incorrect DOUBLE value: 'roca wear'

在我看来,子字符串遍历了数据库中的所有attribute_value,即使那些未引用属性“ length”的子字符串也可以更改?

1 个答案:

答案 0 :(得分:1)

SUBSTRING_INDEX()函数返回字符串的子字符串 然后是您的条件

WHERE substring_index(attribute_values.value,'inch',1) + 0 BETWEEN 0 AND 5

是错误的,因为您正在尝试将字符串添加到数字

可能是您在寻找substr的左侧

WHERE length(substring_index(attribute_values.value,'inch',1)) + 0 BETWEEN 0 AND 5

注意:如果定界符('inch')不够,则该函数返回所有字符串,因此您应检查

您似乎想阅读上一部分:

  

SUBSTRING_INDEX()函数返回字符串的子字符串

of,如果您希望字符串的数字部分在“英寸”之前,则可以尝试使用

WHERE cast(trim(substring_index(attribute_values.value,'inch',1)) AS UNSIGNED ) + 0 
            BETWEEN 0 AND 5

为避免非数字内容的警告,您可以在有条件的情况下尝试使用

WHERE (case when substring_index(attribute_values.value,'inch',1) = attribute_values.value 
 then 1000 
 else cast(trim(substring_index(attribute_values.value,'inch',1)) AS UNSIGNED ) end )
 BETWEEN 0 AND 5