让我根据下面的例子描述问题.
让我们说有一个字符串“abc12345”(可能是任何!!!)并且有一个表mytable,其列为mycolumn of varchar(100).
有些行以最后一个字符5结尾.
有些行以最后一个字符45结尾.
有些行以最后一个字符345结尾
没有以最后一个字符2345结尾的行.
在这种情况下,应选择这些行:
SELECT * FROM mytable WHERE mycolumn LIKE "%345"
这是因为“345”是“abc12345”中最长的右子串,它至少出现一次,作为mycolumn列中至少一个字符串的右子串.
任何想法如何在一个查询中写入?
谢谢.
解决方法:
这是一种蛮力方法:
select t.*
from (select t.*,
dense_rank() over (order by (case when mycolumn like '%abc12345' then 1
when mycolumn like '%bc12345' then 2
when mycolumn like '%c12345' then 3
when mycolumn like '%12345' then 4
when mycolumn like '%2345' then 5
when mycolumn like '%345' then 6
when mycolumn like '%45' then 7
when mycolumn like '%5' then 8
end)
) as seqnum
where mycolumn like '%5' -- ensure at least one match
from t
) t
where seqnum = 1;
然后这激发了这样的事情:
select t.*
from (select t.*, max(i) over () as maxi
from t join
(select str, generate_series(1, length(str)) as i
from (select 'abc12345' as str) s
) s
on left(t.mycolumn, i) = left(str, i)
) t
where i = maxi;
标签:php,mysql,sql
来源: https://codeday.me/bug/20190623/1269623.html