【问题标题】:How to order by in mySQL without the punctuation signs如何在没有标点符号的情况下在 mySQL 中排序
【发布时间】:2013-08-22 20:02:59
【问题描述】:

考虑数据库表列中的以下西班牙语字符串:

¿Donde estas?
!Aqui ando¡
Porque
...Donde
¿Porque?

如果我使用 mySQL 提供的不同西班牙语排序规则对表列进行排序,则标点符号将包含在排序中。一些西班牙排序规则会将标点符号放在开头,一些放在结尾。

但是,根据西班牙文学院的规定,排序仅适用于正式的西班牙字母(a、b、c、d、e、f、g、h、i、j、k、l、m、n , ñ, o, p, q, r, s, t, u ,v ,w ,x, y, z),因此标点符号绝对不能用于对字符串进行排序。 所有 mySQL 西班牙语排序规则使用的顺序都是错误的,我不想使用它们。

根据西班牙文学院,上述字符串的正确排序顺序是:

!Aqui ando¡
¿Donde estas?
Donde estas
...Donde
Porque
¿Porque?

那么,我的下一个最佳选择是什么...

我可以在查询中使用正则表达式来订购不带标点符号的订单吗?

或者,我没有选择创建一个列,我们称之为 sort_name,它包含不带标点符号的字符串,并使用该列进行排序?这是最好的方法吗?

请记住,我仍然需要在 mySQL 中使用西班牙语排序规则来对字符 ñ 进行排序,该字符介于 n 和 o 之间。

【问题讨论】:

  • 继续研究,似乎没有 regexp 函数(如 oracle 的 regexp_replace)可以在 mysql 中排序......太糟糕了.. 所以我的其他选择是新列或其他东西跨度>

标签: mysql sql-order-by collation


【解决方案1】:

一种选择可能是尝试使用 UDF Regular Expression MySQL UDFs,特别是 REGEXP_REPLACE?。

另一种选择可能是使用common_schema,特别是replace_all 函数,例如:

SELECT `mycolumn` FROM `mytable` ORDER BY `common_schema`.replace_all(`mycolumn`, '¡!¿?.', '');

您必须制定一些细节,但都是可能的选择。

【讨论】:

    【解决方案2】:

    在西班牙语中,第一个字符最多是标点符号或...。你可以这样做:

    order by (case when left(col, 3) = '...' then substr(col, 4)
                   when left(col, 1) in ('!', '?', . . .) then substr(col, 2)
                   else col
              end)
    

    (抱歉,我的键盘上没有适合in 列表的西班牙语字符。)

    【讨论】:

    • 这意味着我必须区分所有可能的标点符号和重音字符以及其他内容。如果字符串以两个标点符号开头怎么办。在添加新列和使用大小写之间,我不确定...
    • 我正在分析我的数据并发现了这种情况:Ole con ole 和¡Ole,catapum!如果我使用套管溶液,¡Ole,catapum!将在 Ole con ole 之后排序,这是错误的。换句话说,特殊的标点字符也可以在字符串中找到,而不仅仅是在开头。我想得越多,我就越相信添加一个新列是解决方案......
    • @Marco 。 . .您可能不需要添加新列。您可以将逻辑放在order by 子句中。顺便问一下,您是否将语言环境设置为“es_ES”?
    • 在哪里设置区域设置 es_ES?
    • 现在,我在订单中的一个案例中测试 REGEXP...不确定它是否会工作
    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2022-12-31
    相关资源
    最近更新 更多