【问题标题】:SQL Order By in and varcharSQL Order By in 和 varchar
【发布时间】:2016-07-11 10:00:40
【问题描述】:

我想订购一个包含整数和字符串的 nvarchar 类型的列。我想先订购整数 ASC,然后订购字符串。 这是我的 SQL 语句:

SELECT DISTINCT [Password] 
FROM OCPR 
WHERE [Password] IS NOT NULL
ORDER BY Password

结果是1, 10, 11, 12, 2, 3, K1, K2, N

我想要1, 2, 3, 10, 11, 12, K1, K2, N

【问题讨论】:

标签: sql sql-server sql-order-by


【解决方案1】:

ISNUMERIC 没有回答您认为的问题。例如,ISNUMERIC('£') will return 1,但尝试将其转换为 int 时会出错。 – Damien_The_Unbeliever

在您的数据库中创建这个函数,它比内置的 ISNUMERIC()更好,并且总是精确!

CREATE FUNCTION dbo.IsAllDigits (@MyString VARCHAR(8000))
RETURNS TABLE AS
RETURN (
         SELECT CASE 
                WHEN @MyString NOT LIKE '%[^0-9]%'
                THEN 1
                ELSE 0
                END AS IsAllDigits
        )

然后使用此代码例如:

SELECT DISTINCT [Password] 
FROM OCPR 
WHERE [Password] IS NOT NULL
ORDER BY
    CASE WHEN IsAllDigits([Password]) = 1 THEN 0 ELSE 1 END,
    CASE WHEN IsAllDigits([Password]) = 1 THEN CAST([Password] AS INT) ELSE 0 END,
    [Password]

【讨论】:

    【解决方案2】:
    SELECT DISTINCT [Password] 
    FROM OCPR 
    WHERE [Password] IS NOT NULL
    ORDER BY
        CASE WHEN ISNUMERIC(Password) = 1 THEN 0 ELSE 1 END,
        CASE WHEN ISNUMERIC(Password) = 1 THEN CAST(Password AS INT) ELSE 0 END,
        Password
    

    请试试这个。

    【讨论】:

    • ISNUMERIC 没有回答您认为的问题。例如,ISNUMERIC('£') 将返回 1,但尝试将其转换为 int 时会出错。
    • 正如我所说,尝试运行您的示例代码,其中 Password 仅包含 £ 符号。你会得到一个错误。
    • @Damien_The_Unbeliever:哦。得到你
    • @Damien_The_Unbeliever :但在 Ibraheem 的情况下,没有任何特殊字符,因此可以正常工作。
    • @ChetanSanghani - 这只是一个例子。还有很多其他的 - 例如。 '1d1' 也会倒在这里。 '.' 也一样。关键是,这个函数回答了一个没人想问的问题,所以任何使用它几乎总是一个破损的迹象。
    【解决方案3】:

    您可以使用 ISNUMERIC 函数来完成。 您的查询将如下所示:

    SELECT DISTINCT [Password] 
    FROM OCPR 
    WHERE [Password] IS NOT NULL
    ORDER BY 
    CASE WHEN ISNUMERIC([Password])=1 THEN CONVERT(int,[Password]) ELSE 99999999 END,
    [Password]
    

    希望这会有所帮助;)

    【讨论】:

    • ISNUMERIC 没有回答您认为的问题。例如,ISNUMERIC('£') 将返回 1,但尝试将其转换为 int 时会出错。
    【解决方案4】:

    您可以为此使用Patindex

    Declare @Tasks table(id [nvarchar](max) NOT NULL)
    
    insert into @tasks values ('1'),('7'),('2'), ('12'),('23'),('10'),('K1'), ('K2'), ('P'), ('N')
    
    SELECT * FROM @tasks
    ORDER BY 
    CASE 
      WHEN ISNUMERIC(id)=1 
      THEN CAST(id as int)
    
      WHEN PATINDEX('%[^0-9]%',id) > 1 
      THEN CAST(
        LEFT(
          id,
          PATINDEX('%[^0-9]%',id) - 1
        ) as int)
    
      ELSE 2147483648
    END, 
    
    
    CASE 
      WHEN ISNUMERIC(id)=1 
      THEN NULL
    
      WHEN PATINDEX('%[^0-9]%',id) > 1 
      THEN SUBSTRING(
          id,
          PATINDEX('%[^0-9]%',id) ,
          50
        ) 
    
      ELSE id
    END
    

    【讨论】:

      【解决方案5】:
      SELECT DISTINCT [Password] 
      FROM OCPR 
      WHERE [Password] IS NOT NULL
      ORDER BY Password ASC
      

      /////////////////////////////////////// //////////

      SELECT column_name, column_name
      FROM table_name
      ORDER BY column_name ASC|DESC, column_name ASC|DESC;
      

      $query_test = "SELECT DISTINCT OCPR.password 来自OCPR OCPR.password 不为空 ORDER BY OCPR.password";

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 2010-11-22
        • 1970-01-01
        相关资源
        最近更新 更多