我有一个MySQL表,其价格结构如下:
--------------------
| Price | item_id |
--------------------
|$10,999| 123 |
|$5,889 | 321 |
|$2999 | 143 |
|------------------|
现在如果我查询:
SELECT * FROM products WHERE price BETWEEN "$2999" AND "$6000";
它将返回两行。但如果我质疑这个:
SELECT * FROM products WHERE price BETWEEN "$2999" AND "$20000";
它不会返回任何行,因为它预计会返回至少3行?
请注意,还有许多其他行也是11,000美元,依此类推......
任何帮助将不胜感激!
答案 0 :(得分:4)
您应该将其存储为字符串或varchar。它现在执行的方式是比较字符串,这就是你没有结果的原因。如果我是你,我会通过将列Price
更改为INT
或DECIMAL
或其他任何内容来重组表格,只要它是一个数字。
但是要直接回答你的问题,你可以这样做,但如果你定义了一个,就不会使用任何索引。
WHERE CAST(REPLACE(REPLACE(price,'$',''),',','') AS SIGNED)
BETWEEN 2999 AND 20000
答案 1 :(得分:2)
您似乎将价格存储为字符串而不是数字。 “$ 2999”和“$ 20000”之间没有任何内容,因为“$ 2999”>按字母顺序“$ 20000”。
以下是解决此问题的一种方法:
SELECT
FROM products
WHERE cast(replace(replace(price, '$', ''), ',') as signed) BETWEEN 2999 AND 20000;
更好的方法是将“价格”存储为数字而不是字符。
答案 2 :(得分:1)
我认为Price是一个文本字段而不是数字字段。因此,当您尝试在$ 2999和$ 20000之间获取行时,不会返回任何内容,因为当比较为字符串时,实际上20000小于2999。
您必须将列转换为带有两个小数点的十进制数据类型。
答案 3 :(得分:1)
删除$
并仅保留号码。您无需在数据库中使用数字保存美元符号。
SELECT * FROM products WHERE price > 2999 AND price < 6000;
SELECT * FROM products WHERE price > 2999 AND price < 20000;
或
SELECT * FROM products WHERE price BETWEEN 2999 AND 6000";
SELECT * FROM products WHERE price BETWEEN 2999 AND 20000";