如何在没有a,a,使用oracle pl sql函数的情况下按顺序对书名进行排序

时间:2015-02-05 04:44:52

标签: sql oracle sorting plsql sql-order-by

我试图通过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);

3 个答案:

答案 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;