我试图通过oracle pl / sql函数按字母顺序排列书名,但是想要避免排序中的'a','an','the'。我尝试使用不同的函数创建函数,例如LTRIM,TRIM,REPLACE但是当我使用ORDER BY FUNCTION NAME时,书名没有排序。
创建功能的代码是 -
create or replace function sort_string (p_title in varchar2)
return varchar2
as
begin
return replace(replace(replace(p_title,'THE',''),'a',''),'an','');
end;
/
以及以下用于检索数据的SQL
select book_title
from books
order by sort_string(book_title);
答案 0 :(得分:1)
试试这个
CREATE OR REPLACE FUNCTION sort_string(
p_title IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN trim(REPLACE(REPLACE(REPLACE(p_title,'A ',''),'An ',''),'The ',''));
END;
/
CREATE TABLE book
( bookid INT, book_title VARCHAR(100)
);
INSERT
INTO book VALUES
(
1,
'A reference to the Oracle analytical functions'
);
INSERT INTO book VALUES
(2, 'Croaking tetra from South America'
);
INSERT INTO book VALUES
(3, 'The Animals of Peru'
);
INSERT INTO book VALUES
(4, 'The Grand Medieval Bestiary'
);
INSERT INTO book VALUES
(5, 'The ancient Cities'
);
SELECT sort_string(BOOK_TITLE),book_title
FROM BOOK
ORDER BY nlssort(sort_string(BOOK_TITLE),'NLS_SORT=BINARY_CI');
答案 1 :(得分:1)
以下使用正则表达式的sort函数怎么样:
CREATE OR REPLACE FUNCTION SORT_STRING(P_TITLE IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN UPPER(REGEXP_REPLACE(P_TITLE, '^([a|an|the]+) (.*)$', '\2, \1', 1, 1, 'i'));
END SORT_STRING;
它会出现' a'''或者''在字符串的末尾并返回一个用于排序的大写字符串。 通过修改,它还可以用于格式化输出。
应检查较大数据集上的两个版本的执行计划。
答案 2 :(得分:0)
为什么要使用功能呢?另外,请务必使用以字母“A”开头但不包含字'A'的标题进行测试,依此类推。 ltrim( string, 'A ' )
功能将在通过'美好的一天'时返回'美好的一天',但是当通过'另一个美好的一天'时它也将返回'非常伟大的一天'。这不会像你期望的那样工作。请注意我在 Fiddle
select *
from books
order by case when Book_title like 'A %'
then LTrim( book_title, 'A ' )
when Book_title like 'An %'
then LTrim( book_title, 'An ' )
when Book_title like 'The %'
then LTrim( book_title, 'The ' )
else Book_title end;