VBA SQL ต้องการเปลี่ยนประเภท Column ที่มีเลขและตัวหนังสือผสมอยู่ ให้เป็นตัวเลข


0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

03 ต.ค. 66 , 22:52:14
อ่าน 392 ครั้ง

Ramirez

  • สมาชิกไท.Access
  • กระทู้: 1

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

รบกวนสอบถามพี่ๆหน่อยครับ
ในVBA พอดีว่าจะใช้ SQL เพื่อดึงข้อมูล โดยใช้ตัวเลขเป็นเงื่อนไข วิ่งไปหาข้อมูลในColumnที่มีเลขกะตัวหนังสือ ผสมอยู่ครับ

ตัวอย่าง
Select size from TableA where size >= 0.11 and size <= 0.59
ปัจจุบัน Column size เป็นString โดยที่ข้อมูล มีทั้งตัวเลข และ ตัวหนังสือ ผสมอยู่ ตัวเลขนั้น หลักทศนิยมก็ไม่เท่ากัน จะมี1-3หลัก ปะปนกันอยู่

ลองทำหลายวิธีแล้วครับ
Isnumeric(size) >= 0.11,PATINDEX, Between, และ อื่นๆ ไม่ได้ครับ :cry:
เท่าที่หาข้อมูลมา ลองทำแล้วไม่ได้ครับ
https://www.geeksforgeeks.org/sql-query-to-get-only-numbers-from-a-string/
https://www.pragimtech.com/blog/sql-optimization/sql-function-to-get-number-from-string/

ตอนนี้ใช้เป็น Where size like 0.11* or size like 0.12* ...... or size like 0.59*
ถ้าบางทีเราคิวรี่ ทศนิยมสามหลัก(0.135-4.965) ก็น่าจะไม่ค่อยดีเท่าไหร่ เลยอยากจะเปลี่ยน วิธีการเขียนใหม่

อยากรบกวนสอบถามหน่อยครับว่า
1.เราจะเปลี่ยน ประเภท Columnให้เป็น Integer เพื่อให้มัน where แล้วหา ค่าตั้งแต่เริ่มต้น ถึงปลายทางได้ ยังไงครับ
2.หรือเราจะเขียนFunction SQL ในVBA ยังไงหรอครับ
อ้างอิง การเขียน Function SQL
https://www.pragimtech.com/blog/sql-optimization/sql-function-to-get-number-from-string/
ู***โดยที่ พอคิวรี่ ออกมาแล้ว ค่าจะออกมาแต่ตัวเลขหรือ ค่าจะออกมาทั้งหยวง(ที่มีทั้งเลขและตัวหนังสือก็ได้ครับ)***  :zzz:

ปล. ปัจจุบัน เขียนคิวรี่ SQL ตอนใช้ currentdb.recordset() ครับ

ขอบคุณมากครับ  :prettiness:

 

19 ต.ค. 66 , 13:37:30
ตอบกลับ #1

nonc31

ใช้หลักการค้นหาจุดทศนิยม  แล้วก็ตัดเอาตัวเลขหน้าจุด หลังจุด มาแปลงเป็นตัวเลข  ทำแบบบ้าน  แบบง่ายกว่านี้ทำไม่เป็น  :sweat: :sweat: :sweat:

Option Compare Database

Function chkjood(tjood) As String

    Dim T1, L1 As Integer
    Dim Fn, Ln As String

        T1 = InStr(tjood, ".")
        L1 = Len(tjood)
       
        If IsNumeric(tjood) Then
            If T1 = 1 Then
                chkjood = Round("0" & tjood, 3)
            Else
                If T1 = L1 Then
                    chkjood = Round(Replace(tjood, ".", ""), 3)
                Else
                    chkjood = Round(tjood, 3)
                End If
            End If
        Else
            If T1 = 1 And L1 = 1 Then
                chkjood = ""
            ElseIf T1 = 1 And L1 > 1 Then
                If IsNumeric(Mid(tjood, T1 + 1, 3)) Then
                    chkjood = "0." & Mid(tjood, T1 + 1, 3)
                ElseIf IsNumeric(Mid(tjood, T1 + 1, 2)) Then
                    chkjood = "0." & Mid(tjood, T1 + 1, 2)
                ElseIf IsNumeric(Mid(tjood, T1 + 1, 1)) Then
                    chkjood = "0." & Mid(tjood, T1 + 1, 1)
                Else
                    chkjood = ""
                End If
            ElseIf T1 > 1 And L1 > 1 Then
                If IsNumeric(Left(tjood, T1 - 1)) Then
                    Fn = Left(tjood, T1 - 1)
                Else
                    If T1 = 2 Then
                        If IsNumeric(Left(tjood, 1)) Then
                            Fn = Left(tjood, 1)
                        Else
                            Fn = ""
                        End If
                    ElseIf T1 = 3 Then
                        If IsNumeric(Mid(tjood, T1 - 1, 1)) Then
                            Fn = Mid(tjood, T1 - 1, 1)
                        Else
                            Fn = ""
                        End If
                    ElseIf T1 = 4 Then
                        If IsNumeric(Mid(tjood, T1 - 2, 2)) Then
                            Fn = Mid(tjood, T1 - 2, 2)
                        Else
                            Fn = ""
                        End If
                    ElseIf T1 = 5 Then
                        If IsNumeric(Mid(tjood, T1 - 3, 3)) Then
                            Fn = Mid(tjood, T1 - 3, 3)
                        Else
                            Fn = ""
                        End If
                    ElseIf T1 = 6 Then
                        If IsNumeric(Mid(tjood, T1 - 4, 4)) Then
                            Fn = Mid(tjood, T1 - 4, 4)
                        Else
                            Fn = ""
                        End If
                    ElseIf T1 = 7 Then
                        If IsNumeric(Mid(tjood, T1 - 5, 5)) Then
                            Fn = Mid(tjood, T1 - 5, 5)
                        Else
                            Fn = ""
                        End If
                    ElseIf T1 = 8 Then
                        If IsNumeric(Mid(tjood, T1 - 6, 6)) Then
                            Fn = Mid(tjood, T1 - 6, 6)
                        Else
                            Fn = ""
                        End If
                    ElseIf T1 = 9 Then
                        If IsNumeric(Mid(tjood, T1 - 7, 7)) Then
                            Fn = Mid(tjood, T1 - 7, 7)
                        Else
                            Fn = ""
                        End If
                    ElseIf T1 = 10 Then
                        If IsNumeric(Mid(tjood, T1 - 8, 8)) Then
                            Fn = Mid(tjood, T1 - 8, 8)
                        Else
                            Fn = ""
                        End If
                    End If
                End If
               
                If IsNumeric(Mid(tjood, T1 + 1, 3)) Then
                    chkjood = Fn & "." & Mid(tjood, T1 + 1, 3)
                ElseIf IsNumeric(Mid(tjood, T1 + 1, 2)) Then
                    chkjood = Fn & "." & Mid(tjood, T1 + 1, 2)
                ElseIf IsNumeric(Mid(tjood, T1 + 1, 1)) Then
                    chkjood = Fn & "." & Mid(tjood, T1 + 1, 1)
                Else
                    chkjood = Fn
                End If
            End If
        End If
End Function

------------------------------------------------------------------------------

ใส่สูตรในคิวรี่  =IIf(chkjood([ฟิลด์ข้อมูล])="",Null,CDbl(chkjood([ฟิลด์ข้อมูล])))

 


บอร์ดเรียนรู้ Access สำหรับคนไทย


 

Sitemap 1 2 3 4 5