ตรวจสอบว่าสายอักขระประกอบด้วยสตริงย่อยใน SQL Server 2005 โดยใช้กระบวนงานที่เก็บไว้


245

@mainString = 'CATCH ME IF YOU CAN'ฉันสตริง ฉันต้องการตรวจสอบว่าคำMEนั้นอยู่ข้างใน@mainStringหรือไม่

ฉันจะตรวจสอบว่าสตริงมีสตริงย่อยเฉพาะใน SQL ได้อย่างไร

คำตอบ:


395

CHARINDEX () ค้นหาสตริงย่อยภายในสตริงที่มีขนาดใหญ่กว่าและส่งคืนตำแหน่งของการจับคู่หรือ 0 หากไม่พบคู่ที่ตรงกัน

if CHARINDEX('ME',@mainString) > 0
begin
    --do something
end

แก้ไขหรือจากคำตอบแดเนียลส์หากคุณต้องการค้นหาคำ (และไม่ใช่คำย่อย) การโทร CHARINDEX ของคุณจะมีลักษณะดังนี้:

CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')

(เพิ่มการเรียกซ้ำ REPLACE () เพิ่มเติมสำหรับเครื่องหมายวรรคตอนอื่น ๆ ที่อาจเกิดขึ้น


2
โอเคฉันใช้ PATINDEX ขอบคุณ!
NLV

1
s / recursive / nested / - "recursive" จะREPLACEเรียกว่าตัวเอง "ซ้อน" คือเมื่อผลลัพธ์ของการเรียกฟังก์ชันถูกส่งผ่านไปยังฟังก์ชันอื่นทันที
คดีกองทุนของโมนิกา

2
'ME' จะต้องตรงตามตัวพิมพ์ใหญ่ - เล็กใน SQL หรือคุณต้องใช้คำสั่ง if สำหรับ 'Me' และ 'me' ด้วย?
a.powell

5
@ a.powell - ขึ้นอยู่กับการเปรียบเทียบที่เกี่ยวข้อง คุณสามารถบังคับได้ตลอดเวลาในการทดสอบนี้หากคุณต้องการใช้วิธีใดวิธีหนึ่งหรืออย่างอื่น เช่นเปรียบเทียบและselect CHARINDEX('ME' collate Latin1_General_CS_AS,'Home') select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home')(ในการเปรียบเทียบCSหมายถึง Case Sensitive และฉันแน่ใจว่าคุณสามารถออกกำลังกายได้CI)
Damien_The_Unbeliever

2
@VincePanuccio - การประมวลผลสตริงของ T-SQL นั้นอ่อนแออย่างมาก จุดแข็งของ SQL อยู่ในการดำเนินการตามชุด ในกรณีนี้ (ต้องการที่จะทำการประมวลผลสตริงและสิ่งที่ regex จะเป็นทางออกที่ชัดเจน) มันเป็นเรื่องที่พวกเขาเลือกเครื่องมือที่ผิดสำหรับงาน
Damien_The_Unbeliever

120

คุณสามารถใช้ wildcard ในเพรดิเคต (หลังจาก IF, WHERE หรือ ON):

@mainstring LIKE '%' + @substring + '%'

หรือในกรณีนี้โดยเฉพาะ

' ' + @mainstring + ' ' LIKE '% ME[., ]%'

(ใส่ช่องว่างในสตริงที่ยกมาหากคุณกำลังมองหาทั้งคำหรือปล่อยให้พวกเขาออกถ้าฉันสามารถเป็นส่วนหนึ่งของคำที่ใหญ่กว่า)


3
หากคุณกำลังมองหาคำที่ตรงกัน (ตัวอย่างที่สองของคุณ) คุณจะต้อง a) เพิ่มช่องว่างก่อนและหลัง @mainString (เพื่อให้คุณสามารถจับคู่คำแรกหรือคำสุดท้าย) และ b) ลบเครื่องหมายวรรคตอน
Damien_The_Unbeliever

2
นี่ดีกว่า CHARINDEX () สำหรับฉันเพราะในกรณีของฉันฉันไม่สามารถใช้งาน CHARINDEX () ฟังก์ชั่นได้เนื่องจากการอนุญาตที่ จำกัด
James T Snell

1
(เพียงไม่ลืมที่จะนำหน้าค่าคงที่สตริงทั้งหมดของคุณด้วยNถ้าคอลัมน์ของคุณเป็นnvarcharมิฉะนั้นคุณจะได้รับการแปลงต่อแถว)
ริชาร์ด Szalay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.