SQL从没有LIKE的字符串右侧获取数字
Posted
技术标签:
【中文标题】SQL从没有LIKE的字符串右侧获取数字【英文标题】:SQL get number from right side of string without LIKE 【发布时间】:2018-07-18 20:53:55 【问题描述】:我需要此查询的解决方案,但我无法使用 LIKE 语句。我想我可以使用 INSTR 和 SUBSTR,但我不太熟悉这些。
通常我可以只做一个 LIKE '%7' 但我不能在这里做。这样做的目的是返回我的数据库中任何行的列表,该列表在 Column1 中有一个以 7 结尾的字符串。还值得注意的是,并非所有字符串的长度都相同,而且我使用的是 Oracle SQL Developer .我已经复制了下面的 LIKE 语句。
SELECT Column1, Column2
FROM Table1
WHERE Column1 LIKE '%7'
ORDER BY Column2;
【问题讨论】:
但是……你为什么不能用点赞?Regexp_like
或 Regexp_instr
是允许的吗?这是作业吗?
你能给出你想看到的示例数据和预期输出吗?
使用Substr()
你可以做到WHERE SUBSTR(Column1, -1) = 7
不过这仍然是一个奇怪的要求。
为什么不使用LIKE '%7'
?是因为模式开始时%
的性能问题吗?仍然很奇怪的要求。
对不起,但是声明你“不能”使用LIKE
条件(这是一个条件,而不是一个陈述),没有解释为什么,这在我的书中是一个糟糕的问题。 -1 就是因为这个原因。
【参考方案1】:
也许是这样的?
SELECT x FROM t WHERE SUBSTR(x, -1) = '7'
【讨论】:
【参考方案2】:嗯,一个简单的解决方案是:
where regexp_like(x, '7$')
但不清楚你是否也可以使用该功能。
【讨论】:
【参考方案3】:只是为了补充我认为在大多数情况下更简单且足够好的其他解决方案。
使用以%
开头的模式时,有时查询会变得[非常] 慢。如果是出于性能问题,我会推荐一种性能更好的 [overkill] 解决方案,因为它使用 Index Range Scan 而不是 Full Table Scan:
创建一个存储过程来反转字符串:
CREATE OR REPLACE PROCEDURE ReverseOf(input IN varchar2) IS
rev varchar2(50):='';
BEGIN
FOR i in reverse 1..length(input) LOOP
rev := rev||substr(input, i, 1);
END LOOP;
dbms_output.put_line(rev);
END;
在表中创建一个虚拟列:
alter table table1 add column reversed_column1
generated always as (ReverseOf(column1)) virtual;
在虚拟列上创建索引:
create index ix_reverse_column1 on table1 (reversed_column1);
使用“反向 LIKE”(非常快):
SELECT Column1, Column2
FROM Table1
WHERE reversed_column1 LIKE '7%' -- reverse pattern here!
ORDER BY Column2;
也许矫枉过正,但你可能需要它。去年对我帮助很大。
【讨论】:
太过分了。为什么不简单地在case when substr(column1, -1) = '7' then 1 end
上创建一个索引(所以,一个基于函数的索引)?只有非空值被索引,并且对应于所需的行。或者,为了更笼统,substr(column1, -1)
上的索引。请注意,Oracle 确实没有具有reverseof()
函数。它确实有 reverse()
,但是它没有记录且不受支持 - 所以它不应该在生产环境中使用。
@mathguy 我知道,我知道... :D 无论如何,对于您的解决方案,您需要为模式的每个长度创建一个索引。如果您需要搜索两个字符,则需要另一个索引;三个字符一个第三个,等等。这个解决方案为所有反向搜索创建一个快速索引。以上是关于SQL从没有LIKE的字符串右侧获取数字的主要内容,如果未能解决你的问题,请参考以下文章