如何在没有 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;