ตอนที่ฉันเขียนเพจวันนี้ ฉันรู้สึกหดหู่ใจมากเช่นกัน มีบันทึกอยู่ในตาราง แต่ฉันไม่พบมันใน ASP ปรากฏว่ามีสาเหตุมาจากอักขระตัวแทนที่แตกต่างกันในคำสั่งสืบค้นการเข้าถึงและ SQL .
การเปรียบเทียบอักขระตัวแทนใน ACCESS และอักขระตัวแทนใน SQL SERVER
================================================== =
อักขระตัวแทนสำหรับไลบรารี ACCESS คือ:
*จับคู่อักขระจำนวนเท่าใดก็ได้
? จับคู่อักขระตัวอักษรเดี่ยวใดๆ
อักขระตัวแทนใน SQL Server คือ:
% ตรงกับจำนวนอักขระเท่าใดก็ได้
_ ตรงกับอักขระตัวเดียว
ข้อความ
ตอนที่ฉันเขียนเพจวันนี้ ฉันรู้สึกหดหู่ใจมากเช่นกัน มีบันทึกอยู่ในตาราง แต่ฉันไม่พบมันใน ASP คำสั่ง SQL ทางทฤษฎีมีดังนี้:
เลือก * จาก t_food โดยที่ t_food.name เช่น '*apple*'
เมื่อค้นหาใน GOOGLE ฉันพบว่าข้อความค้นหาที่ไม่ชัดเจนใน ASP ควรเขียนดังนี้:
เลือก * จาก t_food โดยที่ t_food.name เช่น '%%apple%%'
ต้องเป็น % และต้องมีสอง โปรดใส่ใจ.
++++++++++++++++++++++++++++++++++++++++++++++++ ++ ++++++++++++++++++++++
ปัญหาตัวแทนคำสั่งแบบสอบถาม SQL
เมื่อใช้คำสั่ง SQL เพื่อสืบค้นข้อมูลใน Access จะใช้อักขระตัวแทน * สำหรับการสืบค้น คำชี้แจงมีดังนี้:
เลือก * จากปกติโดยที่ชื่อหนังสือเช่น '*h*'
ลองในมุมมอง SQL ของ Access โดยไม่มีปัญหาใดๆ ทุกอย่างทำงานได้ดี ดังนั้นฉันจึงเขียนคำสั่ง SQL ลงในโปรแกรม C# แต่ทันทีที่คำสั่งแบบสอบถามมาถึง ฉันก็เกิดข้อผิดพลาด ดังนั้นฉันจึงค้นหาไฟล์วิธีใช้ของ Access และพบวิธีใช้ต่อไปนี้:
//////////////////////////////////////////////// /// /////////////
เปรียบเทียบนิพจน์สตริงกับรูปแบบในนิพจน์ SQL
ไวยากรณ์
การแสดงออกเหมือนรูปแบบ
ไวยากรณ์ตัวดำเนินการ Like ประกอบด้วยส่วนต่างๆ ต่อไปนี้:
คำอธิบายบางส่วน
expression นิพจน์ SQL ที่ใช้ในคำสั่ง Where
รูปแบบตัวอักษรสตริงถูกเปรียบเทียบกับนิพจน์
แสดงให้เห็น
คุณสามารถใช้ตัวดำเนินการ Like เพื่อค้นหาค่าฟิลด์ที่ตรงกับรูปแบบที่ระบุ สำหรับรูปแบบ คุณสามารถระบุค่าที่สมบูรณ์ได้ (เช่น Like Smith) หรือคุณสามารถใช้ไวด์การ์ดเพื่อค้นหาช่วงของค่า (เช่น Like Sm*)
ในนิพจน์ คุณสามารถใช้ตัวดำเนินการ Like เพื่อเปรียบเทียบค่าฟิลด์กับสตริงได้ ตัวอย่างเช่น หากคุณป้อน Like C* ในแบบสอบถาม SQL แบบสอบถามจะส่งกลับค่าฟิลด์ทั้งหมดที่ขึ้นต้นด้วยตัวอักษร C ในแบบสอบถามพารามิเตอร์ คุณสามารถพร้อมท์ให้ผู้ใช้พิมพ์รูปแบบที่ต้องการค้นหาได้
ตัวอย่างต่อไปนี้ส่งคืนข้อมูลที่ขึ้นต้นด้วยตัวอักษร P และตามด้วยตัวอักษรใดๆ ตั้งแต่ A ถึง F และตัวเลขสามตัว:
ชอบ P[AF]###
ตารางต่อไปนี้แสดงวิธีทดสอบรูปแบบนิพจน์ต่างๆ ผ่านการกด Like
ประเภทการจับคู่
การจับคู่รูปแบบ
(ผลตอบแทนจริง) ไม่มีการแข่งขัน
(ส่งคืนเท็จ)
อักขระหลายตัว a*a aa, aBa, aBBBa aBC
*ab* abc, AABB, Xab aZb, แบค
ตัวละครพิเศษ
อ๊ากกก
อักขระหลายตัว ab* abcdefg, abc cab, aab
อักขระตัวเดียว a?a aaa, a3a, aBa aBBBa
เลขตัวเดียว a#a a0a, a1a, a2a aaa, a10a
ช่วงอักขระ [az] f, p, j 2, &
อยู่นอกช่วง [!az] 9, &, % b, a
ค่าที่ไม่ใช่ตัวเลข [!0-9] A, a, &, ~ 0, 1, 9
ค่าผสม a[!bm]# An9, az0, a99 abc, aj0
ที่อยู่อ้างอิง: http://office.microsoft.com/zh-cn/assistance/HP010322532052.aspx
//////////////////////////////////////////////// ///////////////
ความช่วยเหลือบอกว่าสิ่งนี้และไม่มีปัญหาอะไร มันทำให้ฉันสับสนมากยิ่งขึ้น ต่อมา ฉันถามเพื่อนร่วมงานและพูดว่า: คำสั่ง SQL ของคุณไม่ถูกต้อง อักขระตัวแทนควรเป็น % แทนที่จะเป็น * แต่ความช่วยเหลือระบุว่า * และทุกอย่างทำงานได้ดีเมื่อฉันทดสอบใน Access เพื่อนร่วมงานของฉันไม่สามารถอธิบายได้ว่าทำไม พวกเขาจึงมองหาคำตอบเพื่อขอความช่วยเหลือต่อไป พบข้อมูลต่อไปนี้ในไฟล์วิธีใช้อื่น:
//////////////////////////////////////////////// ///////////////
วิธีการจับคู่รูปแบบในตัวเป็นเครื่องมือทั่วไปสำหรับการเปรียบเทียบสตริง ตารางต่อไปนี้แสดงอักขระตัวแทนที่สามารถใช้กับตัวดำเนินการ Like รวมถึงตัวเลขและสตริงที่ตรงกัน
ตัวละครในรูปแบบ ตรงกับการแสดงออก
? หรือ _ (ขีดเส้นใต้) อักขระตัวใดตัวหนึ่ง
* หรือ % ศูนย์อักขระขึ้นไป
# ตัวเลขเดี่ยวใดก็ได้ (0-9)
[charlist] อักขระเดี่ยวใดๆ ใน charlist
[!charlist] อักขระเดี่ยวใดๆ ที่ไม่อยู่ใน charlist
คุณสามารถใช้ชุดอักขระตั้งแต่หนึ่งตัวขึ้นไป (รายการอักขระ) ที่อยู่ในวงเล็บ ([]) เพื่อจับคู่อักขระตัวเดียวในนิพจน์ และรายการอักขระสามารถประกอบด้วยอักขระส่วนใหญ่ในชุดอักขระ ANSI รวมถึงตัวเลขด้วย อักขระเฉพาะ เช่น วงเล็บซ้าย ([) เครื่องหมายคำถาม (?) เครื่องหมายหลัก (#) และเครื่องหมายดอกจัน (*) สามารถจับคู่กับสัญลักษณ์ได้โดยตรงโดยการใส่เครื่องหมายวงเล็บเหลี่ยม ไม่สามารถใช้วงเล็บปิดภายในกลุ่มเพื่อให้ตรงกับตัวเองได้ แต่สามารถใช้เป็นอักขระตัวเดียวนอกกลุ่มได้
นอกเหนือจากรายการอักขระอย่างง่ายที่อยู่ในวงเล็บเหลี่ยมแล้ว รายการชาร์สามารถมีขอบเขตช่วงบนและล่างคั่นด้วยการใช้ยัติภังค์ (-) ตัวอย่างเช่น เมื่อใช้ [AZ] ในรูปแบบ การจับคู่จะเกิดขึ้นหากอักขระที่สอดคล้องกันในนิพจน์ประกอบด้วยอักขระตัวพิมพ์ใหญ่ใดๆ ในช่วง A ถึง Z คุณสามารถใส่หลายช่วงในวงเล็บเหลี่ยมโดยไม่ต้องคั่นช่วง ตัวอย่างเช่น [a-zA-Z0-9] จะจับคู่อักขระตัวอักษรและตัวเลขใดๆ
โปรดทราบว่าอักขระตัวแทน ANSI SQL (%) และ (_) ใช้ได้เฉพาะในเวอร์ชัน Microsoft® Jet 4.X และ Microsoft OLE DB Provider สำหรับ Jet หากใช้ใน Microsoft Access หรือ DAO จะถือว่าเป็นข้อความ
กฎสำคัญอื่นๆ สำหรับการจับคู่รูปแบบมีดังนี้:
การใช้เครื่องหมายอัศเจรีย์ (!) ที่จุดเริ่มต้นของ charlist จะระบุว่าการจับคู่จะเกิดขึ้นหากอักขระใดๆ ที่อยู่นอก charlist ปรากฏในนิพจน์ เมื่อใช้นอกวงเล็บเหลี่ยม เครื่องหมายอัศเจรีย์จะตรงกับตัวมันเอง
ยัติภังค์ (-) สามารถใช้ที่จุดเริ่มต้น (หลังเครื่องหมายอัศเจรีย์) หรือที่ส่วนท้ายของ charlist เพื่อให้ตรงกัน ในตำแหน่งอื่น ยัติภังค์จะระบุช่วงของอักขระ ANSI
เมื่อระบุช่วงอักขระ อักขระจะต้องปรากฏโดยเรียงลำดับจากน้อยไปหามาก (AZ หรือ 0-100) [AZ] เป็นโหมดที่ถูกต้อง [ZA] เป็นโหมดที่ไม่ถูกต้อง
ลำดับอักขระ [ ] จะถูกละเว้น โดยจะถือเป็นอักขระที่มีความยาวเป็นศูนย์ ( )
ที่อยู่อ้างอิง: http://office.microsoft.com/zh-cn/assistance/HP010322842052.aspx
//////////////////////////////////////////////// /////////////////////
เมื่อถึงจุดนี้ ในที่สุดก็พบเหตุผลแล้ว เนื่องจากฉันใช้ wildcard * ใน Access ทุกอย่างทำงานได้ดี แต่หากฉันเปลี่ยนเป็น % มันจะไม่สำเร็จ ใน C# รองรับเฉพาะ % wildcard เท่านั้น และการแทนที่ด้วย * จะทำให้เกิดข้อผิดพลาด! ปัญหานี้ถือเป็นปัญหาความเข้ากันได้หรือไม่
สัญลักษณ์แทน:
ตัวอย่างคำอธิบายไวด์การ์ด
% สตริงใดๆ ที่มีอักขระตั้งแต่ศูนย์ขึ้นไป โดยที่ชื่อ LIKE '%computer%' จะค้นหาชื่อหนังสือทั้งหมดที่มีคำว่า Computer ที่ใดก็ได้ในชื่อ
_ (ขีดล่าง) อักขระตัวเดียวใดๆ โดยที่ au_fname LIKE '_ean' จะค้นหาชื่อตัวอักษร 4 ตัวทั้งหมดที่ลงท้ายด้วย ean (Dean, Sean ฯลฯ)
[ ] ระบุอักขระตัวเดียวในช่วง ([af]) หรือชุด ([abcdef]) โดยที่ au_lname LIKE '[CP]arsen' จะค้นหานามสกุลผู้เขียนที่ลงท้ายด้วย arsen และเริ่มต้นด้วยอักขระตัวเดียวระหว่าง C และ P เช่น Carsen, Larsen, Karsen เป็นต้น
[^] อักขระเดี่ยวใดๆ ที่ไม่อยู่ในช่วงที่ระบุ ([af]) หรือชุด ([abcdef]) โดยที่ au_lname LIKE 'de[^l]%' จะค้นหานามสกุลผู้เขียนทั้งหมดที่ขึ้นต้นด้วย de และไม่ตามด้วย l
ใช้ไวด์การ์ดเป็นตัวอักษร
คุณสามารถใช้สตริงการจับคู่รูปแบบไวด์การ์ดเป็นสตริงลิเทอรัลได้โดยการใส่อักขระไวด์การ์ดไว้ในวงเล็บ ตารางต่อไปนี้แสดงตัวอย่างการใช้คีย์เวิร์ด LIKE และอักขระตัวแทน [ ]
ความหมายสัญลักษณ์
เช่น '5[%]' 5%
เช่น '[_]n' _n
เช่น '[a-cdf]' a, b, c, d หรือ f
เช่น '[-acdf]' -, a, c, d หรือ f
ชอบ '[ [ ]' [
ชอบ ']' ]
เช่น 'abc[_]d%' abc_d และ abc_de
เช่น 'abc[def]' abcd,abce และ abcf
การจับคู่รูปแบบโดยใช้ส่วนคำสั่ง ESCAPE
ค้นหาสตริงที่มีอักขระตัวแทนพิเศษตั้งแต่หนึ่งตัวขึ้นไป เช่น ตารางส่วนลดในฐานข้อมูลลูกค้าอาจเก็บค่าส่วนลดเป็นเครื่องหมายเปอร์เซ็นต์ (%) เมื่อต้องการค้นหาเครื่องหมายเปอร์เซ็นต์เป็นอักขระแทนที่จะเป็นอักขระตัวแทน คุณต้องระบุคำสำคัญ ESCAPE และอักขระ Escape ตัวอย่างเช่น ฐานข้อมูลตัวอย่างประกอบด้วยคอลัมน์ชื่อความคิดเห็นซึ่งมีข้อความ 30% หากต้องการค้นหาแถวใดๆ ที่มีสตริง 30% ในคอลัมน์ความคิดเห็น ให้ระบุส่วนคำสั่ง Where ที่ประกอบด้วยความคิดเห็น WHERE LIKE '%30!%%' ESCAPE '!' หากคุณไม่ได้ระบุ ESCAPE และอักขระ Escape SQL Server จะส่งกลับแถวทั้งหมดที่มีสตริง 30
ตัวอย่างต่อไปนี้แสดงวิธีค้นหาสตริงลดราคา 50% เมื่อซื้อสำเนาตั้งแต่ 100 ชุดขึ้นไปในคอลัมน์บันทึกย่อของตารางชื่อเรื่องในฐานข้อมูล pubs:
เลือกบันทึกจากชื่อ โดยที่บันทึก LIKE 'ลด 50%% เมื่อซื้อสำเนา 100 เล่มขึ้นไป' ESCAPE '%'