要排序的数据示例:
xy3abc公司
Y3BC公司
z3bd型
排序顺序必须是abc、bbc、bd,无论数字前面是什么。
我试过:

SELECT
  *,
  LEAST(
    if (Locate('0',fcccall) >0,Locate('0',fcccall),99),
    if (Locate('1',fcccall) >0,Locate('1',fcccall),99),
    if (Locate('2',fcccall) >0,Locate('2',fcccall),99),
    if (Locate('3',fcccall) >0,Locate('3',fcccall),99),
    if (Locate('4',fcccall) >0,Locate('4',fcccall),99),
    if (Locate('5',fcccall) >0,Locate('5',fcccall),99),
    if (Locate('6',fcccall) >0,Locate('6',fcccall),99),
    if (Locate('7',fcccall) >0,Locate('7',fcccall),99),
    if (Locate('8',fcccall) >0,Locate('8',fcccall),99),
    if (Locate('9',fcccall) >0,Locate('9',fcccall),99)
  ) as locationPos,
  SUBSTRING(fcccall,locationPos,3) as fccsuffix
FROM memberlist
ORDER BY locationPos, fccsuffix

但是locationPos给了我一个关于子字符串函数调用的错误

最佳答案

在同一个locationPos列表中的另一个表达式中,无法通过其别名SELECT引用该表达式。
复制整个表达式是SQL的方法。(是的,重复整个表达式很难看。)
另一种(性能较差的)方法是使用查询(减去fccsuffix表达式)作为内联视图。外部查询可以引用指定的locationPos别名作为列名。
举个简单的例子:

SELECT v.locationPos
  FROM ( SELECT 'my really big expression' AS locationPos
           FROM ...
       ) v

这种使用内联视图(“派生表”)的方法可能会对大型集产生一些严重的性能影响。
但对于原始性能,重复表达式是一种方法:
SELECT *
     , LEAST(
        if (Locate('0',fcccall) >0,Locate('0',fcccall),99),
        if (Locate('1',fcccall) >0,Locate('1',fcccall),99),
        if (Locate('2',fcccall) >0,Locate('2',fcccall),99),
        if (Locate('3',fcccall) >0,Locate('3',fcccall),99),
        if (Locate('4',fcccall) >0,Locate('4',fcccall),99),
        if (Locate('5',fcccall) >0,Locate('5',fcccall),99),
        if (Locate('6',fcccall) >0,Locate('6',fcccall),99),
        if (Locate('7',fcccall) >0,Locate('7',fcccall),99),
        if (Locate('8',fcccall) >0,Locate('8',fcccall),99),
        if (Locate('9',fcccall) >0,Locate('9',fcccall),99)
       ) AS locationPos
     , SUBSTRING(fcccall
       , LEAST(
          if (Locate('0',fcccall) >0,Locate('0',fcccall),99),
          if (Locate('1',fcccall) >0,Locate('1',fcccall),99),
          if (Locate('2',fcccall) >0,Locate('2',fcccall),99),
          if (Locate('3',fcccall) >0,Locate('3',fcccall),99),
          if (Locate('4',fcccall) >0,Locate('4',fcccall),99),
          if (Locate('5',fcccall) >0,Locate('5',fcccall),99),
          if (Locate('6',fcccall) >0,Locate('6',fcccall),99),
          if (Locate('7',fcccall) >0,Locate('7',fcccall),99),
          if (Locate('8',fcccall) >0,Locate('8',fcccall),99),
          if (Locate('9',fcccall) >0,Locate('9',fcccall),99)
         ),3
       ) AS fccsuffix
  FROM memberlist
 ORDER BY locationPos, fccsuffix

不幸的是,在MySQL中,不能在同一个SELECT列表中的表达式中引用locationPos列的结果。

08-04 10:54