示例表:
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
答案 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;
如果你想保留当前的表,那么你可以改变它然后像这样更新
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`;