2015-05-26 72 views
1

这是我整个脚本通过CHARINDEX Sql Server的

CREATE TABLE #TEST (
STATE CHAR(2)) 

INSERT INTO #TEST 
SELECT 'ME' UNION ALL 
SELECT 'ME' UNION ALL 
SELECT 'ME' UNION ALL 
SELECT 'SC' UNION ALL 
SELECT 'NY' UNION ALL 
SELECT 'SC' UNION ALL 
SELECT 'NY' UNION ALL 
SELECT 'SC' 

SELECT * 
FROM #TEST 
ORDER BY CHARINDEX(STATE,'SC,NY') 

有关订单我要显示所有记录问题开始with SC firstsecond with NY然后休息来没有任何顺序。

当我执行上面的sql,那么首先所有记录来与ME这是不是在我的顺序列表。

告诉我我犯的错误。谢谢。

回答

3

使用CASE声明

SELECT * 
FROM #TEST 
ORDER BY CASE WHEN STATE LIKE 'SC%' THEN 0 
       WHEN STATE LIKE 'NY%' THEN 1 
       ELSE 2 
     END 

输出

STATE 
----- 
SC 
SC 
SC 
NY 
NY 
ME 
ME 
ME 
2

在这里看到什么CHARINDEX返回时没有找到您的搜索模式。
- https://msdn.microsoft.com/en-GB/library/ms186323.aspx

要避免处理0的情况,您可以使用下面的内容。

ORDER BY 
    CASE LEFT(state, 2) 
     WHEN 'SC' THEN 1 
     WHEN 'NY' THEN 2 
       ELSE 3 
    END 

这应该是更容易编写,阅读和维护。

它应该使用更少的CPU,但我怀疑它会使有形的区别。

1

CASE/IIFLIKE是一种方法。您也可以像这样更改您的CHARINDEX以获得您想要的结果。在您的情况下,问题是按升序排列,因为此类记录返回0,因此不会先显示匹配记录。您可以将条件反转为'NY,SC'并执行DESC订单。

查询

SELECT * 
FROM #TEST 
ORDER BY CHARINDEX(STATE,'NY,SC') DESC,State 

输出

SC 
SC 
SC 
NY 
NY 
ME 
ME 
ME 
+0

感谢。为什么这个查询'SELECT * FROM #TEST ORDER BY CHARINDEX(STATE,'SC,NY')DESC' return wrong result。它与您的查询相比有点不同。在你的情况下,你先写'NY,然后写SC',然后我写出相反的结果,然后看到错误的结果。可以更详细地解释发生了什么事情。谢谢 – Mou

+0

'SC'中'SC'的'CHARINDEX','NY'将给出'1','NY'给出'4'。这就是为什么我将它更改为“NY,SC”,所以SC将给出4和NY 1.现在DESC将优先给予'SC',然后给予'NY',然后给予任何不匹配的字符。 – ughai

+0

当它发现不匹配时,它返回0;请参阅我答案中的链接。另外,尝试添加CHARINDEX调用(你的和Ughai的)到你的SELECT,看看它返回什么... – MatBailie