ถ้าเรา 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)


แล้วใช้ได้กับทุก Database ไหมครับ
ตอบลบconcept ได้ครับ แต่ code ไม่น่าจะได้ ต้องเอาไป modify เองครับ ตาม syntax db นั้นๆ
ตอบลบ