Sql 如何处理ORDERBY子句中的字符串排序?

Sql 如何处理ORDERBY子句中的字符串排序?,sql,Sql,假设我想按名为STORY\u LENGTH的字段(字符串数据类型)对记录进行排序。这个字段是一个多值字段,我用逗号表示多个值。例如,对于record1,其值为“1”,record2的值为“1,3”,对于record3,其值为“1,2”。现在,当我想根据故事长度对记录进行排序时,记录的排序方式如下record1>record3>record2。很明显,STORY\u LENGTH数据类型是字符串,order by ASC将该值作为字符串进行排序。但是,问题来了。例如,当record4=“10”和r

假设我想按名为
STORY\u LENGTH
的字段(字符串数据类型)对记录进行排序。这个字段是一个多值字段,我用逗号表示多个值。例如,对于record1,其值为“1”,record2的值为“1,3”,对于record3,其值为“1,2”。现在,当我想根据
故事长度
对记录进行排序时,记录的排序方式如下
record1>record3>record2
。很明显,
STORY\u LENGTH
数据类型是字符串,
order by ASC
将该值作为字符串进行排序。但是,问题来了。例如,当
record4=“10”
record5=“2”
我尝试订购时,它看起来像
record4>record5
,这显然是我不想要的。因为
2>10
而我使用的字符串格式仅仅是因为字段的多个值。 那么,任何人,你能帮我解决这个问题吗?我需要一些好主意来解决。
感谢您所描述的多值字段意味着您的数据模型已损坏,应予以修复


一旦这样做了,查询就变得简单多了。

据我所知,您希望按照存储在VARCHAR字段中的逗号分隔值中的第二个或第一个数字对项目进行排序。实现将取决于所使用的数据库,例如在MySQL中,它看起来像:

SELECT * FROM stories 
ORDER BY CAST(COALESCE(SUBSTRING_INDEX(story_length, ',', -1), '0') AS INTEGER)
然而,出于性能原因,使用这种排序通常并不好,因为排序需要扫描整个表,而不是在字段上使用索引

编辑:编辑后,看起来您希望按第一个值排序,并忽略逗号后的值。根据上面的一些评论,数据库设计中的更改不是一个选项,只需使用以下代码进行排序:

SELECT * FROM stories 
ORDER BY CAST(COALESCE(NULLIF(SUBSTRING_INDEX(story_length, ',', 1), ''), '0') AS INTEGER)

该字段将包含多个相同类型的值。例如,一首歌有两种长度:10,15或类似10的单曲。目前,db设计无法更改。@Masud Rahman-这是不幸的。您可能希望使用
LIKE
操作符,在应用程序中执行字符串操作和过滤,而不是DB。修复您的设计。简单,谢谢。看起来不错。我会尝试这个,并提供反馈