2016-03-07 102 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