Mine

รูปภาพของฉัน
หาดใหญ่, ภาคใต้, Thailand
ชอบเอาใจ แต่ก็เอาแต่ใจ

วันพฤหัสบดีที่ 17 มิถุนายน พ.ศ. 2553

ช่วงบน และช่วงล่าง ของความดันแยกจากกันได้มั้ย

สวัสดีค่ะ ...
เนื่องจากมีเสียงสมาชิก Hospital OS สอบถามมาหลายเสียง เรื่อง "การหาค่า บน และ ค่าล่าง ของความดัน" ทำอย่างไร เช่น 120/80 ต้องการทราบว่าค่าบน คือ 120 ส่วนค่าล่างคือ 80 จะทำได้อย่างไร เพราะความจริงแล้วเราไม่สามารถระบุได้ว่าค่าบนจะเป็น 3 หลักเสมอไป เพราะผู้ป่วยบาง case อาจจะมี 2 หลักก็เป็นได้ เช่น 82/59

ซึ่งตรงนี้คิดว่า คนที่ไม่ถามก็อาจจะอยากรู้ หรือ คนที่ได้บอกไปแล้ว ก็อาจจะได้มาทำความเข้าใจกันค่ะ

มาดูกันเลยค่ะ ...

ถ้าเรามองข้อมูลกันให้ดีๆ จะเห็นว่าเป็น Pattern เดียวกันค่ะ
120/80
82/59

จะเห็นว่าข้อมูลที่จัดเก็บนั้น จะคั่นค่าชั้นบน กับค่าชั้นล่าง ด้วย "/"
เราสามารถนำ "/" มาช่วยในการตัดข้อมูลแยกจากกันได้ค่ะ
แต่ว่า เราจะทราบได้อย่างไรว่าตำแหน่งของ "/" จะอยู่ที่ไหนกันแน่

ก่อนอื่นมาทบทวนกันก่อนค่ะ เรื่อง String ใน PostgreSQL
การนับ String หรือ สายอักษร เราจะเริ่มนับที่ 1 ค่ะ เช่น 120/80
1 -> นับเป็นตำแหน่งที่ 1
2 -> นับเป็นตำแหน่งที่ 2
0 -> นับเป็นตำแหน่งที่ 3
/ -> นับเป็นตำแหน่งที่ 4
8 -> นับเป็นตำแหน่งที่ 5
0 -> นับเป็นตำแหน่งที่ 6

ขอนำเสนอคำสั่ง position ซึ่งเป็นคำสั่งในการหาตำแหน่งของคำที่เรากำหนดค่ะ
รูปแบบคำสั่ง
position('[คำที่เราต้องการหาตำแหน่ง]' in [ชื่อ Filed ที่เราต้องการให้หาตำแหน่งของคำ])
จะแสดงผลลัพธ์เป็น
จะแสดงค่าตำแหน่งของคำที่ค้นหา
ถ้าพบ -> จะแสดงตำแหน่งโดยเริ่มนับจาก 1
ถ้าไม่พบ -> จะแสดงเลข 0
ตัวอย่าง จากข้อมูลความดัน
120/80
82/59
คำสั่งที่เขียน(ขออ้างอิงตารางของ HOspital OS)
select
visit_vital_sign_blood_presure --ข้อมูลที่เก็บในฐานข้อมูล
, position('/' in visit_vital_sign_blood_presure) --แสดงตำแหน่งของ "/" ที่หาพบในข้อมูล
from t_visit_vital_sign
ผลลัพธ์
120/80    4
82/59    3

เมื่อเราได้ตำแหน่งของ "/" ตามที่ต้องการแล้ว มาดูกันต่อว่าเราจะนำมาใช้งานได้อย่างไร

เราจำคำสั่ง substring ได้หรือเปล่าคะ ยังไงก็มาดูก็แล้วกัน
รูปแบบคำสั่ง1 
substring([ชื่อ Filed ที่เราต้องการตัด],[ตำแหน่งเริ่มต้นของการตัด],[จำนวนที่เราต้องการตัด])
จะแสดงผลลัพธ์เป็น
แสดงอักษรจากจุดที่เริ่มตัด นับไปเท่ากับจำนวนที่เรากำหนด
ตัวอย่าง จากข้อมูลความดัน
120/80
82/59
คำสั่งที่เขียน(ขออ้างอิงตารางของ HOspital OS)
select
visit_vital_sign_blood_presure --ข้อมูลที่เก็บในฐานข้อมูล
, substring(visit_vital_sign_blood_presure,1,3) --แสดงข้อมูลที่ต้องการตัด ตำแหน่งที่ 1 นับไป 3 ตัว
from t_visit_vital_sign
ผลลัพธ์
120/80    120
82/59    82/

รูปแบบคำสั่ง2
substring([ชื่อ Filed ที่เราต้องการตัด],[ตำแหน่งเริ่มต้นของการตัด])
จะแสดงผลลัพธ์เป็น
แสดงอักษรจากจุดที่เริ่มตัดไปจนสิ้นสุดอักขระของ String นั้น
ตัวอย่าง จากข้อมูลความดัน
120/80
82/59
คำสั่งที่เขียน(ขออ้างอิงตารางของ HOspital OS)
select
visit_vital_sign_blood_presure --ข้อมูลที่เก็บในฐานข้อมูล
, substring(visit_vital_sign_blood_presure,5) --แสดงข้อมูลที่ต้องการตัด ตำแหน่งที่ 5 เป็นต้นไป
from t_visit_vital_sign
ผลลัพธ์
120/80    80
82/59    9

เราเรียนรู้คำสั่งในการตัด String แล้วแต่เราก็ยังไม่สามารถนำมาใช้โดยตรงได้ค่ะ เพราะจากลักษณะของข้อมูลแล้วมีความเป็นไปได้ตามข้อมูลตัวอย่างข้างต้น เมื่อเรากับหนดค่าที่ตัดลงไปแบบ Fixed เราก็จะได้ผลลัพธ์ที่ไม่ถูกต้องค่ะ เราต้องนำความรู้มาผสมผสานให้เกิดสิ่งที่เราต้องการให้ได้ นั่นคือ การนำ position เข้ามาเป็นส่วนหนึ่งของการตัด String ถ้าเราสังเกตุตัวอย่าง จะเห็นว่า

ลองสันนิฐานดูว่า
จากตัวอย่างข้อมูลความดัน 120/80   
เราต้องการตัด string 3 หลักแรก คือ substring(visit_vital_sign_blood_presure,1,3)
ค่า position ของ "/" คือ 4  
เป็นไปได้หรือไม่ว่า จำนวนที่เราต้องการ คือ position-1 นั่นคือ 4-1 = 3

จากตัวอย่างข้อมูลความดัน 82/59   
เราต้องการตัด string 2 หลักแรก คือ substring(visit_vital_sign_blood_presure,1,2)
ค่า position ของ "/" คือ 3  
เป็นไปได้หรือไม่ว่า จำนวนที่เราต้องการ คือ position-1 นั่นคือ 3-1 = 2

ดังนั้น จากข้อสันนิฐาน เราก็นำมาพิสูจน์กันค่ะ ลองเขียนคำสั่งที่นำมาผสมผสานกันดูนะคะ
จะได้เป็น
select visit_vital_sign_blood_presure --ค่าในฐานข้อมูล
, position('/' in visit_vital_sign_blood_presure) --ตำแหน่งของ "/"
, substring(visit_vital_sign_blood_presure,1,(position('/' in visit_vital_sign_blood_presure)) -1) --ค่าความดันช่วงบน
from t_visit_vital_sign
where visit_vital_sign_blood_presure <> '' --ป้องกันค่าว่าง เพราะจะทำให้เกิด Error ได้ค่ะ
จะได้ผลลัพธ์เป็น
120/80    120
82/59    82

แล้วลองดูผลลัพธ์ที่เครื่องคุณนะคะ ว่าได้ผลที่ถูกต้องหรือเปล่า

ค่ะ อั้นนั้นมันเป็นเรื่องของเบื้องบน เราลองมาดูเบื้องล่างกันบ้างนะคะ
ลองสันนิฐานดูว่า
จากตัวอย่างข้อมูลความดัน 120/80   
เราต้องการตัด string หลังจาก "/" ทั้งหมด คือ substring(visit_vital_sign_blood_presure,5)
ค่า position ของ "/" คือ 4  
เป็นไปได้หรือไม่ว่า จุดเริ่มต้นที่เราต้องการ คือ position+1 นั่นคือ 4+1 = 5

จากตัวอย่างข้อมูลความดัน 82/59   
เราต้องการตัด string หลังจาก "/" ทั้งหมด คือ substring(visit_vital_sign_blood_presure,4)
ค่า position ของ "/" คือ 3  
เป็นไปได้หรือไม่ว่า จุดเริ่มต้นที่เราต้องการ คือ position+1 นั่นคือ 3+1 = 4

ดังนั้น จากข้อสันนิฐาน เราก็นำมาพิสูจน์กันค่ะ ลองเขียนคำสั่งที่นำมาผสมผสานกันดูนะคะ
จะได้เป็น
select visit_vital_sign_blood_presure --ค่าในฐานข้อมูล
, position('/' in visit_vital_sign_blood_presure) --ตำแหน่งของ "/"
, substring(visit_vital_sign_blood_presure,(position('/' in visit_vital_sign_blood_presure)) +1) --ค่าความดันช่วงล่าง
from t_visit_vital_sign
where visit_vital_sign_blood_presure <> '' --ป้องกันค่าว่าง เพราะจะทำให้เกิด Error ได้ค่ะ
จะได้ผลลัพธ์เป็น
120/80    80
82/59    59

ไหนๆ ก็ทำแล้วก็ลองเอามารวมกันเลยค่ะ จะได้รันทีเดียวได้ ทั้งช่วงบนช่วงล่าง
ตามนี้
select visit_vital_sign_blood_presure
, substring(visit_vital_sign_blood_presure,1,(position('/' in visit_vital_sign_blood_presure)) -1) --ค่าความดันช่วงบน
, substring(visit_vital_sign_blood_presure,(position('/' in visit_vital_sign_blood_presure)) +1) --ค่าความดันช่วงล่าง
from t_visit_vital_sign where visit_vital_sign_blood_presure <> ''

ค่ะ ถึงตอนนี้ก็อยู่ที่ว่าจะนำไปใช้ทำอะไรแล้วค่ะ ไม่ว่าจะเป็น
- ผู้ป่วยที่มีความดัน เกิน 140 มีใครบ้าง อะไรประมาณนี้

อ่อ...แล้วก็ ไม่จำเป็นว่าคำสั่งต่างๆที่เราใช้จะต้องอยู่ใน select นะคะ เพราะถ้าเรานำไปเป็นเงื่อนไขก็ต้องนำไปอยู่ที่ where ... ได้เช่นเดียวกัน ที่ยกตัวอย่างขึ้นมาเพื่อให้แสดงผลออกมาให้เห็นนะคะ

เอาเป็นว่าวันนี้ก็พอก่อนนะคะ เดี๋ยวมีคำถามก็ฝากไว้ได้ค่ะ และหวังว่าจะเกิดกับโยชน์กับทุกคนที่สนใจค่ะ หรือมีอะไรชี้แนะก็ส่งมาได้เสมอค่ะ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น