SQL-ORDER BY子句(一列中有多个数据)

SQL-ORDER BY子句(一列中有多个数据),sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,有人能帮我解决这个问题吗 如何查询: 我的问题是: `SELECT TOP 1000 [WireID] ,[PadNo] ,[Pattern] ,[Tester] FROM FROM [WLSystem].[dbo].[TblR8Pure] ORDER BY LEN(Tester), Tester ASC` 结果: 尝试下面的查询 SELECT TOP 1000 [WireID] ,[PadNo] ,[Pattern] ,[Tester] FROM F

有人能帮我解决这个问题吗

如何查询:

我的问题是:

  `SELECT TOP 1000 [WireID]
  ,[PadNo]
  ,[Pattern]
  ,[Tester]
  FROM FROM [WLSystem].[dbo].[TblR8Pure] 
  ORDER BY LEN(Tester), Tester ASC`
结果:


尝试下面的查询

SELECT TOP 1000 [WireID]
  ,[PadNo]
  ,[Pattern]
  ,[Tester]
  FROM FROM [WLSystem].[dbo].[TblR8Pure] 
  ORDER BY Tester ASC

除此之外,这种类型的约会存储是糟糕的设计。此查询将按tester列的前3个数字对结果进行排序。这是通过使用stuff删除所有剩余字符来实现的

  SELECT TOP 1000 [WireID]
  ,[PadNo]
  ,[Pattern]
  ,[Tester]
  FROM FROM [WLSystem].[dbo].[TblR8Pure] 
  ORDER BY STUFF(Tester,4,99,'') ASC
您可以使用和从逗号分隔的字符串中获取第一项:

SELECT TOP 1000 
        [WireID],
        [PadNo],
        [Pattern],
        [Tester]    
FROM [WLSystem].[dbo].[TblR8Pure]
ORDER BY CAST(
        CASE WHEN CHARINDEX(';',[Tester])-1 < 0 THEN REPLACE([Tester],CHAR(13)+CHAR(10),'')
            ELSE REPLACE(SUBSTRING([Tester],1,CHARINDEX(';',[Tester])-1),CHAR(13)+CHAR(10),'')
            END
             as int)
但最好的方法是规范化数据,去掉1列中逗号分隔的值。

确保以文本格式包含测试数据。回答起来容易多了。你也会得到更多有价值的答案

简化试验数据:

CREATE TABLE #TblR8Pure
(
    [No] int,
    PadNo varchar(10),
    Pattern int,
    Jumper varchar(100)
)

INSERT #TblR8Pure VALUES
(3, '4_39', 85, '40'),
(3, '4_45', 79, '225 ; 219'),
(3, '4_40', 79, '418 ; 566'),
(3, '4_46', 79, '229 ; 355 ; 320'),
(3, '4_44', 79, '234 ; 362 ; 318'),
(3, '4_55', 79, '1000 ; 1')
以下是解决方案规则:

记录按分号分隔值中的最小跳线排序,并转换为int-XML部分 值可以包含白色字符LTRIM、RTRIM 如果发现两个相等的跳线,则记录由第二、第三etc枢轴和订购部件订购,此处限制为5个字段。 以下是解决方案:

SELECT [No], PadNo, Pattern, Jumper FROM
(
    SELECT [No], PadNo, Pattern, Jumper, Rec, Value, ROW_NUMBER() OVER (PARTITION BY Rec ORDER BY Value) R FROM
    (
        SELECT [No], PadNo, Pattern, Jumper, Rec, CONVERT(int, RTRIM(LTRIM(R.value('.', 'varchar(10)')))) Value FROM
        (SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) Rec, CONVERT(xml,'<a>'+REPLACE(Jumper, ';', '</a><a>')+'</a>') X FROM #TblR8Pure) T
        CROSS APPLY T.X.nodes('a') T2(R)
    ) T
) T
PIVOT
(MAX(Value) FOR R IN ([1],[2],[3],[4],[5])) P
ORDER BY [1],[2],[3],[4],[5]

我得到了正确的答案=

MS SQL:

MYSQL:

我想这是


请参考网站:

请以文本格式包含样本数据,不要像图片一样。将值存储为csv不是好的数据库设计。你应该改变it@GiorgosBetsos图中显示了示例结果。同意@Jens。如果您有第三行中的列表:42、128、28,那么整个排序就没有意义了。如果列表中的起始值42之后可以有一个较低的值28,那么您的顺序可能不会是您所期望的。至少这对我来说没有多大意义。您使用的是什么SQL Server版本?Hi@gofr1我尝试按较低的值执行您的查询,例如40是中间值。试着看看我编辑过的帖子。谢谢你加演员。。。在ORDERBY语句中使用int。将varchar值“100”转换为数据类型int或my时,为该查询提供一个tryMsg 245,级别16,状态1,行1转换失败。您得到了空格。。。添加rtrim和ltrim。如果你有答案,请看我的编辑;而不是像你之前的问题中提到的那样,更改“,”on“;”在CHARINDEX partMsg 174,级别15,状态1,第6行中,stuff函数需要4个参数。很抱歉,忘记添加参数以将剩余字符替换为空,请重试。