gpt4 book ai didi

MySQL 字符串位置和子串排序

转载 作者:行者123 更新时间:2023-11-29 02:51:33 27 4
gpt4 key购买 nike

要排序的示例数据:

xy3abc
y3bbc
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 给我一个关于子字符串函数调用的错误

最佳答案

不可能在同一 SELECT 列表中的另一个表达式中通过别名 locationPos 引用该表达式。

复制整个表达式将是执行此操作的 SQL 方法。 (是的,重复整个表达式是丑陋的。)

另一种(性能较低的)方法是使用您的查询(减去 fccsuffix 表达式)作为内联 View 。外部查询可以引用分配的 locationPos 别名作为列名。

举个简单的例子:

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

这种使用内联 View (“派生表”)的方法可能会对大型集合产生一些严重的性能影响。

但对于原始性能,重复表达式是可行的方法:

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,不可能在 same SELECT 列表中的表达式中引用 locationPos 列的结果。

关于MySQL 字符串位置和子串排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35159162/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com