我需要对包含正数和负数的列运行多个查询,并返回<
或>
的所有行而不是选定的值,但是当我使用时它不会返回预期的结果如果所选值为负数,则为“大于”运算符。
请注意,当所选值为负数时,它应返回正数和负数,并且似乎从结果中排除负数。
SELECT T3.*
FROM Rules T3
WHERE T3.Width > '-.80';
T3.Width中包含的值是:
0.90,(0.70),(0.70),(0.70),(0.70),(1.00),(1.00),(1.00),(1.00),(0.90),(0.55),(0.50)
因此结果应为:
0.90,(0.70),(0.70),(0.70),(0.70),(0.55),(0.50)
但是返回的结果是:
0.90
答案 0 :(得分:1)
最简单的解决方案当然是使用表格中的DECIMAL()
或FLOAT
列。
由于您正在使用VARCHAR()
类型并且更愿意继续使用VARCHAR
,因此RDBMS未正确将()
个封闭值视为否定值,而是尝试将字符串强制转换为一个整数(导致零和不正确的比较)。
()
所附的否定词:使用()
- 附加的否定值,REPLACE()
(
开场-
REPLACE()
和)
结束-0.70
没有,导致像< >
这样的值,但它仍然是MySQL的字符串。然后,您必须CAST
it to a decimal value进行SELECT Width
FROM T3
WHERE
/* Replace the ( to -, and the ) with nothing
* then cast it to a decimal value
*/
CAST(REPLACE(REPLACE(Width, '(', '-'), ')', '') AS DECIMAL(10,2)) > '-0.8'
比较。
VARCHAR
如果您将其更改为常规负数但保留REPLACE()
类型,则不需要所有嵌套DECIMAL(10,2)
,但您仍需要将其转换为SELECT Width
FROM T3
WHERE
CAST(Width AS DECIMAL(10,2)) > '-0.8'
}。
{{1}}
答案 1 :(得分:1)
你强制进行文字比较
SELECT T3.*
FROM Rules T3
WHERE T3.Width > -.80;
使用数字比较,'-.80'
与-.80
的差异只是引号。
当您按数值进行比较时,查询将返回预期结果
如果您必须使用引号,请使用CAST('-.80' AS DECIMAL(12,2))
这给出2个小数位和10个数字,对于大多数演员来说应该足够了,但如果需要的话可以调整
如果比较操作中的两个参数都是字符串,则它们是 比较为字符串。