如何在没有 a, an 的情况下使用 oracle pl sql 函数对书名进行排序
how to sort book titles in order without a, an, the using oracle pl sql function
我试图通过 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);
试试这个
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');
下面使用正则表达式的排序函数怎么样:
CREATE OR REPLACE FUNCTION SORT_STRING(P_TITLE IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN UPPER(REGEXP_REPLACE(P_TITLE, '^([a|an|the]+) (.*)$', ', ', 1, 1, 'i'));
END SORT_STRING;
它会将 'a'、'an' 或 'the' 的出现放在字符串的末尾,而 return 是用于排序的大写字符串。
经过修改,它也可以用于格式化输出。
应该在较大数据集上检查两个版本的执行计划。
为什么要使用函数?此外,请务必使用以字母 'A' 而非 单词 'A ' 等开头的标题进行测试。 ltrim( string, 'A ' )
函数在传递 'A Great Day' 时将 return 'Great Day',但在传递 'Another Great Day' 时也会 return 'nother Great Day'。这不会像您预期的那样工作。请注意我在 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;
我试图通过 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);
试试这个
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');
下面使用正则表达式的排序函数怎么样:
CREATE OR REPLACE FUNCTION SORT_STRING(P_TITLE IN VARCHAR2) RETURN VARCHAR2 IS
BEGIN
RETURN UPPER(REGEXP_REPLACE(P_TITLE, '^([a|an|the]+) (.*)$', ', ', 1, 1, 'i'));
END SORT_STRING;
它会将 'a'、'an' 或 'the' 的出现放在字符串的末尾,而 return 是用于排序的大写字符串。 经过修改,它也可以用于格式化输出。
应该在较大数据集上检查两个版本的执行计划。
为什么要使用函数?此外,请务必使用以字母 'A' 而非 单词 'A ' 等开头的标题进行测试。 ltrim( string, 'A ' )
函数在传递 'A Great Day' 时将 return 'Great Day',但在传递 'Another Great Day' 时也会 return 'nother Great Day'。这不会像您预期的那样工作。请注意我在 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;