Oracle NLS_排序不用于部分选择

Oracle NLS_排序不用于部分选择,oracle,oracle12c,Oracle,Oracle12c,我已将nls\u sort参数设置为BINARY\u AI以执行不区分大小写的排序。我在系统和会话中设置了它: alter session set nls_sort='BINARY_AI'; alter system set nls_sort='BINARY_AI' scope=spfile; 此查询的排序正确: SELECT s."Id", s."Label" FROM "Software" s ORDER BY s."Label" Id | Label __________

我已将
nls\u sort
参数设置为
BINARY\u AI
以执行不区分大小写的排序。我在系统和会话中设置了它:

alter session set nls_sort='BINARY_AI';
alter system set nls_sort='BINARY_AI' scope=spfile;
此查询的排序正确:

SELECT s."Id", s."Label" FROM "Software" s ORDER BY s."Label"

    Id   |  Label
_______________________
10218    | Able2Extract
10217    | AVS Video Recorder
如果我使用此查询执行部分选择:

SELECT * FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY "Label" ASC) AS MYROW, subSelect.* 
    FROM (
        SELECT s."Id", s."Label" FROM "Software" s
    ) subSelect
) WHERE MYROW BETWEEN 1 AND 100
排序不区分大小写:

    Id   |  Label
_______________________
10217    | AVS Video Recorder
10218    | Able2Extract

错误在哪里?

您没有在第二个查询中指定排序顺序,因为您没有
order BY
子句,因此结果以不确定的顺序返回

您的
MYROW
值是根据NLS排序顺序分配的,但是您只使用该值进行筛选,而不是对结果集进行排序。您可以再次使用该选项:

SELECT "Id", "Label" FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY "Label" ASC) AS MYROW, subSelect.* 
    FROM (
        SELECT s."Id", s."Label" FROM "Software" s
    ) subSelect
) WHERE MYROW BETWEEN 1 AND 100
ORDER BY MYROW;
或按标签订购:

SELECT "Id", "Label" FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY "Label" ASC) AS MYROW, subSelect.* 
    FROM (
        SELECT s."Id", s."Label" FROM "Software" s
    ) subSelect
) WHERE MYROW BETWEEN 1 AND 100
ORDER BY "Label";
当您使用
ROW_NUMBER
时,您也不需要像使用
ROWNUM
那样使用两级子查询;您可以将其简化为:

SELECT "Id", "Label" FROM (
    SELECT s."Id", s."Label",
      ROW_NUMBER() OVER (ORDER BY s."Label" ASC) AS MYROW
    FROM "Software" s
) WHERE MYROW BETWEEN 1 AND 100
ORDER BY "Label";
内部查询返回
MYROW
的预期值(在SQL FIDLE上比较,和)。但这是在使用11.2.0.2,在11.2.0.3中它也适用于我。我目前没有一个12c实例可供测试,但其他人可能能够验证那里的行为


如果您在12.1.0.1中看到的
MYROW
的值错误,您可能遇到了错误18353141或16934803,这两个错误都出现在正确的区域,并在12.1.0.2补丁集发行说明中提到。检查详细信息。

不,我不想这样做,因为排序是在部分选择之后应用的。因此,如果值“AVS Video Recorder”的行号为100,“Able2Extract”的行号为101,则排序不区分大小写,但应用太晚,并且当值“AVS Video Recorder”将出现在结果中时,值“Able2Extract”将不出现在结果中。如果在子选择中添加排序,则不会产生任何效果。。。。NLS_排序将按OVER子句的顺序应用,但实际情况并非如此。是虫子吗?@士兵们-我没看到。仅使用两个值,内部选择将“Able2Extract”的MYROW值设置为1,“AVS Video Recorder”的值设置为2,我认为这是您想要的。(和相反的顺序)。好的,谢谢你的帮助。它可以使用Oracle 11g数据库,但我无法使用Oracle 12c数据库。你能证实这一点吗?嗯,很有趣;很抱歉,我目前无法访问12c。如果这是一个已经修复的bug,那么可能值得编辑这个问题,以确切说明您在哪个版本/补丁级别看到这种行为。好的,我使用的是Oracle 12.1.0.1,我已经安装了Oracle 12.1.0.2,现在使用部分select排序不区分大小写。非常感谢你!