从Varchar字段中查找最大值

时间:2010-12-20 08:17:52

标签: php database-design mysql

我有一个数据库字段,称为SCORES,有Scores 值可能如下所示

123

14

56 *

342

423 *

我将它存储在数据库的Varchar字段中。

假设我将其转换为数据类型的整数,那么我可以写 最大(SCORES)并获得最高分或最高分。 但是Integer不允许像*。

这样的特殊字符

(这里*表示该分数的一些条款)

为了让我把它变成varchar。

使用最少的编程方法,最简单的方法是获得最高分。

因此,如果我执行查询,我应该得到答案为

423 *

请建议我

6 个答案:

答案 0 :(得分:1)

处理这种情况的最佳方法是将表结构更改为

  • SCORES int数据类型。
  • 在名为的表中添加一个新字段 clause
  • 如果您的大部分SCORES没有 clause,您必须规范化表格 将clause字段移动到 不同的表。

答案 1 :(得分:1)

您应该更改表格架构......

SELECT scores
FROM tablename
ORDER BY replace(scores, '*', '') DESC
LIMIT 1;

答案 2 :(得分:1)

我认为你的查询应该是通用的,以获得最高分,今天你只有'*'附加分数,但将来可能你使用其他人的角色或者你可能使用某些角色组合所以你应该小心那种情况。

所以如果你创建一个用户定义函数会更好,它将varchar作为输入并从输入字符串返回数字,就像你传递'1234 *'然后函数将返回1234并且如果你传递1234 **它将返回1234。

CREATE FUNCTION dbo.ParseNumeric
(
  @string VARCHAR(8000)
)
RETURNS VARCHAR(8000)
AS
BEGIN
  DECLARE @IncorrectCharLoc SMALLINT
  SET @IncorrectCharLoc = PATINDEX('%[^0-9A-Za-z]%', @string)
  WHILE @IncorrectCharLoc > 0
  BEGIN
    SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
    SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
  END
  SET @string = @string
  RETURN @string
END
GO

然后使用:

select max(cast(dbo.ParseNumeric(score) as int)) from tableName

答案 3 :(得分:0)

SELECT MAX(CAST(scores AS SIGNED))
  FROM tablename

但是这个查询会很慢,因为它无法使用索引进行优化。

答案 4 :(得分:0)

试试这个SQL:

SELECT MAX(CONVERT(REPLACE(FIELD,'*',''),signed)) FROM TABLE

有:

  • 替换varchar
  • 中的*
  • 将结果转换为整数(签名)
  • 选择MAX值

编辑1:

我一直在使用一些数据来获取SQL,我有一个包含一个字段的表(varchar,没有键),我插入了62962个值(每个1000都有一个'*',结果如下:)< / p>

SELECT MAX(CONVERT(REPLACE(FIELD,'*',''),signed)) FROM TABLE

花了0.0666秒。

SELECT scores FROM tablename ORDER BY replace(scores, '*', '') DESC LIMIT 1;

执行0.089秒并获得错误的值:

HTH:)

答案 5 :(得分:0)

您可以将星号移动到新字段(取决于您是否需要)。之后,您可以更改数据类型。

UPDATE
    tableName
SET
    score = REPLACE(score, '*', ''),
    specialCharField = IF(CONTAINS(score, '*'), '*', '');
相关问题