2016-03-07 201 views
0

我想按'/us/'是否在url中排序。我目前有:SQL按字符串排序

SELECT is_live, store_url from my_table where item_id = 1306085 
ORDER BY (CASE WHEN store_url LIKE '%/us%' THEN 1 ELSE 0 END) DESC 

有没有更干净的方法来做到这一点,或者是上述唯一的方法?从概念上讲,我正在寻找一些更可读,如:

ORDER BY store_url.contains('/us/') DESC 
+0

您可以在MySQL中创建一个存储函数或用户定义的函数(http://dev.mysql.com/doc/refman/5.7/en/create-function.html)。 –

+0

@FrankJ感谢您的想法,这是一个整洁的方法。你能否在回答中表明如何解决上述问题? – David542

+0

您不需要转换,无论如何,true都被视为1,而false则被视为0。所以'ORDER BY store_url LIKE'%/ us%''DESC'应该没问题......如果你希望它看起来更像是一个函数调用,你可以使用[INSTR](http://dev.mysql.com/doc /refman/5.7/en/string-functions.html#function_instr)函数...虽然它返回实际找到的位置,所以您希望在'INSTR(...)= 0 ASC'上进行排序,以防止不必要的排名位置在字符串中。 – Uueerdo

回答

2

你可以试试这个:

SELECT is_live, store_url from my_table where item_id = 1306085 
ORDER BY instr(store_url, '/us/'); 

或:

SELECT is_live, store_url from my_table where item_id = 1306085 
ORDER BY instr(store_url, '/us/') > 0 ; 

SQLFiddle

1

你可以创建function

CREATE FUNCTION mycontains (s text, matchText VARCHAR(255)) 
RETURNS INT DETERMINISTIC 
RETURN (CASE WHEN s LIKE CONCAT("%", matchText, "%") THEN 1 ELSE 0 END); 

,并使用它像

SELECT is_live, store_url from my_table where item_id = 1306085 
ORDER BY mycontains(store_ul, "/us/") DESC 

注:已经有一个包含的功能,我认为它的工作原理与几何对象,这就是为什么我命名这个mycontains。

+0

你有没有听说过“奥卡姆的剃须刀”:[绝不能不必要地假设多少]?链接:https://en.wikipedia.org/wiki/Occam%27s_razor#Ockham;) – MaxU

+0

@MaxU:那么,您的解决方案通过返回索引引入了一个可能不想要的订单,所以除非您修改解决方案,否则不能进一步排序通过均衡大于0的所有结果。因此,这有些不同。 –

+0

OP不关心每个部分(0和1)是否会被排序......并且您的解决方案没有考虑斜杠 - '/ us /';) – MaxU