这个问题是我上一个问题的延伸部分, 的 Finding number position in string
我的表myTable
如下(myWord ==> varchar(10))
++++++++++++
+ myWord +
++++++++++++
+ AB123 +
+ A413 +
+ X5231 +
+ ABE921 +
+ 15231 +
+ 523 +
+ ABC +
++++++++++++
我想要的是如下。
++++++++++++++++++++++++++++++++
+ myWord + myPos + NewString +
++++++++++++++++++++++++++++++++
+ AB123 + 3 + AB +
+ A413 + 2 + A +
+ X5231 + 2 + X +
+ ABE921 + 4 + ABE +
+ 15231 + 1 + +
+ 523 + 1 + +
+ ABC + 999 + ABC +
++++++++++++++++++++++++++++++++
要获得以上输出,我使用了以下查询。
SELECT
myWord,
LEAST (
if (Locate('0',myWord) >0,Locate('0',myWord),999),
if (Locate('1',myWord) >0,Locate('1',myWord),999),
if (Locate('2',myWord) >0,Locate('2',myWord),999),
if (Locate('3',myWord) >0,Locate('3',myWord),999),
if (Locate('4',myWord) >0,Locate('4',myWord),999),
if (Locate('5',myWord) >0,Locate('5',myWord),999),
if (Locate('6',myWord) >0,Locate('6',myWord),999),
if (Locate('7',myWord) >0,Locate('7',myWord),999),
if (Locate('8',myWord) >0,Locate('8',myWord),999),
if (Locate('9',myWord) >0,Locate('9',myWord),999)
) as myPos,
if (LEAST (
if (Locate('0',myWord) >0,Locate('0',myWord),999),
if (Locate('1',myWord) >0,Locate('1',myWord),999),
if (Locate('2',myWord) >0,Locate('2',myWord),999),
if (Locate('3',myWord) >0,Locate('3',myWord),999),
if (Locate('4',myWord) >0,Locate('4',myWord),999),
if (Locate('5',myWord) >0,Locate('5',myWord),999),
if (Locate('6',myWord) >0,Locate('6',myWord),999),
if (Locate('7',myWord) >0,Locate('7',myWord),999),
if (Locate('8',myWord) >0,Locate('8',myWord),999),
if (Locate('9',myWord) >0,Locate('9',myWord),999)
)=999,myWord,SUBSTR(myWord,1,LEAST (
if (Locate('0',myWord) >0,Locate('0',myWord),999),
if (Locate('1',myWord) >0,Locate('1',myWord),999),
if (Locate('2',myWord) >0,Locate('2',myWord),999),
if (Locate('3',myWord) >0,Locate('3',myWord),999),
if (Locate('4',myWord) >0,Locate('4',myWord),999),
if (Locate('5',myWord) >0,Locate('5',myWord),999),
if (Locate('6',myWord) >0,Locate('6',myWord),999),
if (Locate('7',myWord) >0,Locate('7',myWord),999),
if (Locate('8',myWord) >0,Locate('8',myWord),999),
if (Locate('9',myWord) >0,Locate('9',myWord),999)
)-1)) as NewString
FROM myTable;
将列名称作为 MyPos 后,为什么我不能在另一列中使用该名称,如下面的查询所示?
SELECT
myWord,
LEAST (
if (Locate('0',myWord) >0,Locate('0',myWord),999),
if (Locate('1',myWord) >0,Locate('1',myWord),999),
if (Locate('2',myWord) >0,Locate('2',myWord),999),
if (Locate('3',myWord) >0,Locate('3',myWord),999),
if (Locate('4',myWord) >0,Locate('4',myWord),999),
if (Locate('5',myWord) >0,Locate('5',myWord),999),
if (Locate('6',myWord) >0,Locate('6',myWord),999),
if (Locate('7',myWord) >0,Locate('7',myWord),999),
if (Locate('8',myWord) >0,Locate('8',myWord),999),
if (Locate('9',myWord) >0,Locate('9',myWord),999)
) as myPos,
if (myPos=999,myWord,SUBSTR(myWord,1,myPos-1)) as NewString
FROM myTable;
但是,这给了我错误
Unknown column 'myPos' in 'field list':
请建议我使用别名 缩短查询时间。
答案 0 :(得分:2)
尝试将最少的部分作为子选择。你可以别名。
这样的事情:
SELECT
mytable.myWord,
myPos.l,
if (l=999,mytable.myWord,SUBSTR(mytable.myWord,1,l-1)) as NewString
FROM myTable,
(select myword, LEAST (
if (Locate('0',myWord) >0,Locate('0',myWord),999),
if (Locate('1',myWord) >0,Locate('1',myWord),999),
if (Locate('2',myWord) >0,Locate('2',myWord),999),
if (Locate('3',myWord) >0,Locate('3',myWord),999),
if (Locate('4',myWord) >0,Locate('4',myWord),999),
if (Locate('5',myWord) >0,Locate('5',myWord),999),
if (Locate('6',myWord) >0,Locate('6',myWord),999),
if (Locate('7',myWord) >0,Locate('7',myWord),999),
if (Locate('8',myWord) >0,Locate('8',myWord),999),
if (Locate('9',myWord) >0,Locate('9',myWord),999)
) as l from mytable)
as myPos
where myPos.myword = mytable.myword
答案 1 :(得分:1)
根据@juergend的答案,我也尝试过以下的工作。
SELECT
t1.myWord, t2.l as MyPos, if (t2.l=999,t1.myWord,SUBSTR(t1.myWord,1,t2.l-1)) as NewString
FROM myTable t1 JOIN
(select id, LEAST (
if (Locate('0',myWord) >0,Locate('0',myWord),999),
if (Locate('1',myWord) >0,Locate('1',myWord),999),
if (Locate('2',myWord) >0,Locate('2',myWord),999),
if (Locate('3',myWord) >0,Locate('3',myWord),999),
if (Locate('4',myWord) >0,Locate('4',myWord),999),
if (Locate('5',myWord) >0,Locate('5',myWord),999),
if (Locate('6',myWord) >0,Locate('6',myWord),999),
if (Locate('7',myWord) >0,Locate('7',myWord),999),
if (Locate('8',myWord) >0,Locate('8',myWord),999),
if (Locate('9',myWord) >0,Locate('9',myWord),999)
) as l from mytable) as t2
ON t1.id=t2.id;
注意:为此,我在表格中添加了id
来加入两个表格。