หน้าเว็บ

วันอังคารที่ 3 กุมภาพันธ์ พ.ศ. 2558

oracle sql order by multiple point string

ปัญหา

ถ้าเรา order by string แบบธรรมดาๆ  เราจะเจอปัญหาแบบนี้



การ order by string  10 จะมาก่อน 2  เพราะรหัส ASCII ของ 1 อยู่ก่อน 2

วิธีแก้

เปลี่ยนมา order by ด้วย sql function ที่ผมเขียนขึ้นมาใหม่  ได้เป็น


การแสดงผล  ถูกต้อง  เพราะเราแปลงมันไปเป็นตัวเลขก่อน

PL/SQL สำหรับแปลง multiple point ไปเป็นตัวเลข
CREATE OR REPLACE PACKAGE converter_pack AS

    FUNCTION pad_string(p_multiple_point VARCHAR2, p_index NUMBER) RETURN VARCHAR2;
  
    FUNCTION multiple_point2number(p_multiple_point VARCHAR2, p_point NUMBER) RETURN NUMBER;
  
END converter_pack;

/* package body */
CREATE OR REPLACE PACKAGE body converter_pack AS

    FUNCTION pad_string( p_multiple_point VARCHAR2, p_index NUMBER) RETURN VARCHAR2 AS
      l_pad VARCHAR2(255);
    BEGIN
      SELECT lpad(regexp_substr (p_multiple_point, '[^.]+', 1, p_index), 3, '0')
      INTO l_pad
      FROM dual;
      
      RETURN l_pad;
    END pad_string;
    
    FUNCTION multiple_point2number(p_multiple_point VARCHAR2, p_point NUMBER) RETURN NUMBER AS
      l_temp VARCHAR2(255);
      l_numb VARCHAR2(255);
    BEGIN
      FOR i IN 1..p_point LOOP
        l_temp   := pad_string(p_multiple_point, i);
        IF l_temp = '' OR l_temp IS NULL THEN
          l_temp := '000';
        END IF;
        l_numb := l_numb || l_temp;
      END LOOP;
      
      RETURN to_number(l_numb);
    END multiple_point2number;

END converter_pack;
การเรียกใช้
select SEQUENCE_ORDER,
       converter_pack.multiple_point2number(SEQUENCE_ORDER, 5) as numb
from MY_TABLE
order by numb
multiple_point2number(p_multiple_point VARCHAR2, p_point NUMBER)

p_multiple_point คือ String multiple point ที่เราส่งเข้าไป  เช่น 1.2.3.4
p_point คือ จำนวนจุด (.) สูงสุด  ที่คิดว่าจะมีใน p_multiple_point  ซึ่งของผมคือ 5 (เช่น 1.2.3.4.5.6)

2 ความคิดเห็น:

  1. แล้วใช้ได้กับทุก Database ไหมครับ

    ตอบลบ
  2. concept ได้ครับ แต่ code ไม่น่าจะได้ ต้องเอาไป modify เองครับ ตาม syntax db นั้นๆ

    ตอบลบ