ถ้าเรา 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 numbmultiple_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 นั้นๆ
ตอบลบ