如何从子查询的varchar列中选择max

fzwojiic  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(184)

在一个表中,varchar中有两列“art”和“price”。“价格”的格式为货币。
要找到我所用物品的最高价格:

SELECT art, price FROM books 
WHERE price = (SELECT MAX(CAST(REPLACE(REPLACE(price, ',', ''),'.','') AS INT)) 
FROM books)

这行不通。拜托,怎么了?

6ljaweal

6ljaweal1#

你需要把价格和价格比较一下。因此,一种方法是:

SELECT b.art, b.price
FROM books b
WHERE b2.price = (SELECT b2.price
                  FROM books b2
                  ORDER BY REPLACE(REPLACE(b2.price, ',', ''), '.', '') + 0 DESC
                  LIMIT 1
                 );

您应该将值存储为 decimal / numeric 类型 . 表示有小数部分。我不建议删除它,因此:

WHERE b2.price = (SELECT b2.price
                  FROM books b2
                  ORDER BY REPLACE(b2.price, ',', '') + 0 DESC
                  LIMIT 1
                 );

这将显式转换替换为隐式转换——因为mysql对具有 CAST .
最后,也可以使用窗口函数来处理:

select b.*
from (select b.*,
             rank() over (order by REPLACE(b2.price, ',', '') + 0 desc) as seqnum
      from books b
     ) b
where seqnum = 1
bvhaajcl

bvhaajcl2#

当您强制转换为整数时,请使用 SIGNED 或者 UNSIGNED 作为目标。

SELECT art, price FROM books 
WHERE price = (SELECT MAX(CAST(REPLACE(REPLACE(price, ',', ''),'.','') AS SIGNED)) 
FROM books)

应该将数值存储为数字而不是字符串。

相关问题