我有一个数据库字段,称为SCORES,有Scores 值可能如下所示
123
14
56 *
342
423 *
我将它存储在数据库的Varchar字段中。
假设我将其转换为数据类型的整数,那么我可以写 最大(SCORES)并获得最高分或最高分。 但是Integer不允许像*。
这样的特殊字符(这里*表示该分数的一些条款)
为了让我把它变成varchar。
使用最少的编程方法,最简单的方法是获得最高分。
因此,如果我执行查询,我应该得到答案为
423 *
请建议我
答案 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
有:
编辑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, '*'), '*', '');