订购具有值范围的文本字段

时间:2015-04-21 20:33:38

标签: sql sql-server tsql

我有一个名为customer-range的字段,对于某些客户,该字段具有以下方式的值:

Customer ID, Customer-range
1111,[0-1]
1111,[1-2]
1111,[2-3]

对于某些客户来说,它只是一个这样的整数:

2222, 11
2222, 3
2222, 14

所以基本上我想编写一个订购客户范围的select语句。它是数据库中的文本字段。我怎样才能做到这一点?

这是我在Google和在线朋友的帮助下尝试过的:

;WITH MyCTE
AS (
    SELECT 1111 CustID
        ,'[0-1]' CustomerRange

    UNION

    SELECT 1111
        ,'[10-13]'

    UNION

    SELECT 1111
        ,'[7-10]'


    )
SELECT *
    ,CASE 
        WHEN CHARINDEX('[', CustomerRange) = 0
            THEN '[' + CustomerRange + '-' + CustomerRange + ']'
        ELSE CustomerRange
        END SortedBy
FROM MyCTE
ORDER BY CASE 
        WHEN CHARINDEX('[', CustomerRange) = 0
            THEN '[' + CustomerRange + '-' + CustomerRange + ']'
        ELSE CustomerRange
        END

当整数值小于10时,上面的代码可以工作,但似乎没有为超过9的任何值对它们进行排序。 上面例子的顺序应该是       [0-1]       [7-10]       [10-13]

谢谢

3 个答案:

答案 0 :(得分:1)

你走了:

;WITH MyCTE
AS (
    SELECT 1111 CustID
        ,'[0-1]' CustomerRange

    UNION

    SELECT 1111
        ,'[10-13]'

    UNION

    SELECT 1111
        ,'[7-10]'
    )
    ,MyCTE1
AS (
    SELECT CustID
        ,CASE 
            WHEN CHARINDEX('[', CustomerRange) = 0
                THEN '[' + CustomerRange + '-' + CustomerRange + ']'
            ELSE CustomerRange
            END SortedBy
    FROM MyCTE
    )
    ,MySortCTE
AS (
    SELECT replace(substring(sortedby, charindex('-', sortedby) + 1, len(sortedby)), ']', '') AS sort_num
        ,CustID
        ,SortedBy
    FROM MyCTE1
    )
SELECT CustID,SortedBy
FROM mySortCTE
--  WHERE CUSTID = 1111   uncomment this line to filter CustID
ORDER BY sort_num

答案 1 :(得分:1)

您的数据结构不符合良好的规范化实践。您应该将CustomerRange分为两列。一个低和一个高数字。由于您可能无法对其进行更改,因此这里的查询将执行我认为您想要的操作,即按CustID和CustomerRange中的第一个数字进行排序。

WITH MyCTE
AS
(
    SELECT 1111 CustID,CustomerRange
    FROM (VALUES('0-1'),('10-13'),('7-10')) AS A(CustomerRange)

    UNION ALL

    SELECT 2222,CustomerRange
    FROM (VALUES('11'),('3'),('14')) B(CustomerRange)
)

SELECT  CustID,
        CustomerRange,
        CASE
            WHEN CHARINDEX('-',CustomerRange) = 0
                THEN CONCAT('[',CustomerRange,'-',CustomerRange,']')
            ELSE CONCAT('[',CustomerRange,']')
        END Range_With_Brackets,
        order_col
FROM MyCTE
CROSS APPLY (SELECT CAST(LEFT(CustomerRange,CHARINDEX('-',CustomerRange + '-' ) - 1) AS INT)) CA(order_col)
ORDER BY CustID,order_col

结果:

CustID      CustomerRange Range_With_Brackets order_col
----------- ------------- ------------------- -----------
1111        0-1           [0-1]               0
1111        7-10          [7-10]              7
1111        10-13         [10-13]             10
2222        3             [3-3]               3
2222        11            [11-11]             11
2222        14            [14-14]             14

答案 2 :(得分:0)

我无法真正了解您希望订购的方式,但是为了回应您的评论"当整数值小于10时,但似乎没有为任何值排序它们超过9",看起来它将您的数字视为字符串,这就是为什么不正确订购。例如数字11大于9但字符串" 11"小于" 9"

您必须使用CAST将字符串转换为数字