是否可以使用regexp replace对mysql表进行排序?

时间:2014-07-16 23:16:42

标签: mysql regex sorting

示例表:

ID Name
1  Apple Color: Yellow
2  Apple Color: Red
3  Banana Color: Yellow
4  Banana Color: Brown
5  Apple Color: Yellow

是否可以按名称订购此列表,但只考虑水果名称,删除“颜色:无论”部分?那么结果会是这样的吗?

ID Name
1  Apple
2  Apple
5  Apple
3  Banana
4  Banana

“Pseudocode”就像这样我想:

select * from fruits order by REGEXP_REPLACE(name, '/ Color:.*/', '') asc

3 个答案:

答案 0 :(得分:3)

Use SUBSTRING_INDEX(str,delim,count)

... ORDER BY SUBSTRING_INDEX(str,delim,count)

链接:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index

答案 1 :(得分:0)

简短回答,不,不是没有UDF - How to do a regular expression replace in MySQL?

正如@LLPrudente在他的回答中提到的,如果有问题的字段总是在冒号后面没有其他颜色,你可以使用SUBSTRING_INDEX。扩展他的建议你可以做以下

... ORDER BY TRIM(SUBSTRING_INDEX(name, ':', -1))

最后一个稍好的答案,真的这些应该存储为两个单独的字段,即“名称”和“颜色”而不是这个。可能是您已经清理了数据,因此看起来好像可以更好地呈现这些数据,并且可能在您的实际数据集中以某种方式出现这种情况。考虑退一步并重新思考您的结构,因为上述内容不是最有效的方法。

答案 2 :(得分:0)

这是一种计算不同水果(水果总数)的半简单方法。

SELECT COUNT(DISTINCT LEFT(`name`, LOCATE("Color:", `name`)-1)) as total_fruits
FROM exampe_table;

老实说,你想要规范化你的数据库..你可以添加另一个表来匹配颜色,甚至重做这个表并添加另一列。这将是一种简单的方式

CREATE TABLE fruits_n_colors 
(`id` int, `name` varchar(255), `color` varchar(255))
    SELECT id, 
        SUBSTRING_INDEX(Name, ' Color: ', 1) as name, 
        SUBSTRING_INDEX(Name, ' Color: ', -1) as color
    FROM exampe_table
    ORDER BY id;

DEMO


如果你想保留当前的表,那么你可以改变它然后像这样更新

ALTER TABLE exampe_table 
    ADD COLUMN `fruit` VARCHAR(55), 
    ADD COLUMN `color` VARCHAR(55);

UPDATE exampe_table et,
(
    SELECT 
        id,
        SUBSTRING_INDEX(Name, ' Color: ', 1) AS fruit, 
        SUBSTRING_INDEX(Name, ' Color: ', -1) AS color
    FROM exampe_table
)t
SET et.fruit = t.fruit, et.color = t.color WHERE et.id = t.id;

ALTER TABLE exampe_table 
    DROP COLUMN `Name`;

ANOTHER DEMO