有关CHARINDEX Sql Server订单的问题

时间:2015-05-26 08:18:20

标签: sql sql-server tsql

这是我的整个剧本

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,但我怀疑它会产生有形的差异。

答案 2 :(得分:1)

带有CASE

IIF / LIKE是一种方法。您也可以像这样更改CHARINDEX以获得您想要的内容。在您的情况下,问题是按升序排列,首先不会显示匹配记录,因为此类记录会返回0。您可以将标准撤消到'NY,SC'并执行DESC订单。

<强>查询

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

<强>输出

SC
SC
SC
NY
NY
ME
ME
ME