รายการอักขระพิเศษสำหรับส่วนคำสั่ง SQL LIKE


119

รายการอักขระพิเศษทั้งหมดสำหรับ SQL คืออะไร (ฉันสนใจ SQL Server แต่ตัวอื่น ๆ ก็น่าจะดีเช่นกัน) LIKE clause?

เช่น

SELECT Name FROM Person WHERE Name LIKE '%Jon%'

เซิร์ฟเวอร์ SQL :

  1. %
  2. _
  3. [specifier] เช่น [az]
  4. [^ ระบุ]
  5. ESCAPE clause เช่น% 30! %% 'ESCAPE'! ' จะประเมิน 30% ตามความเป็นจริง
  6. 'อักขระต้องถูกหลีกเลี่ยงด้วย' เช่นพวกเขากลายเป็นพวกเขา '

MySQL:

  1. % - สตริงใด ๆ ที่มีอักขระศูนย์ขึ้นไป
  2. _ - อักขระเดี่ยวใด ๆ
  3. ESCAPE clause เช่น% 30! %% 'ESCAPE'! ' จะประเมิน 30% ตามความเป็นจริง

ออราเคิล:

  1. % - สตริงใด ๆ ที่มีอักขระศูนย์ขึ้นไป
  2. _ - อักขระเดี่ยวใด ๆ
  3. ESCAPE clause เช่น% 30! %% 'ESCAPE'! ' จะประเมิน 30% ตามความเป็นจริง

Sybase

  1. %
  2. _
  3. [specifier] เช่น [az]
  4. [^ ระบุ]

ความคืบหน้า:

  1. % - สตริงใด ๆ ที่มีอักขระศูนย์ขึ้นไป
  2. _ - อักขระเดี่ยวใด ๆ

    คู่มืออ้างอิงที่นี่ [PDF]

PostgreSQL:

  1. % - สตริงใด ๆ ที่มีอักขระศูนย์ขึ้นไป
  2. _ - อักขระเดี่ยวใด ๆ
  3. ESCAPE clause เช่น% 30! %% 'ESCAPE'! ' จะประเมิน 30% ตามความเป็นจริง

ANSI SQL92:

  1. %
  2. _
  3. อักขระ ESCAPE หากระบุไว้เท่านั้น

PostgreSQL ยังมีตัวSIMILAR TOดำเนินการซึ่งเพิ่มสิ่งต่อไปนี้:

  1. [specifier]
  2. [^specifier]
  3. | - อย่างใดอย่างหนึ่งจากสองทางเลือก
  4. * - การทำซ้ำของรายการก่อนหน้าเป็นศูนย์หรือมากกว่าครั้ง
  5. + - การทำซ้ำรายการก่อนหน้าอย่างน้อยหนึ่งครั้ง
  6. () - จัดกลุ่มรายการเข้าด้วยกัน

แนวคิดคือทำให้เป็น Wiki ชุมชนที่สามารถกลายเป็น "ร้านค้าครบวงจร" สำหรับสิ่งนี้


อาจเป็นเรื่องที่ควรค่าแก่การกล่าวถึงข้อ ESCAPE SQL Server, Oracle และ MySQL รองรับสิ่งนี้ทั้งหมด ไม่รู้เกี่ยวกับ Sybase
Dave Webb

ฉันคิดว่าตอนนี้ประโยค ESCAPE เป็น SQL มาตรฐานดังนั้นอาจต้องการเพียงครั้งเดียวเท่านั้น
Dave Webb

ฉันไม่รู้ตัวเองว่ามีการใช้งานในเซิร์ฟเวอร์ที่ระบุไว้ทั้งหมด (และอาจมีการเพิ่มในภายหลัง) ดังนั้นฉันจึงไม่เต็มใจที่จะดึงมันออกมาในส่วน หากคุณมั่นใจว่าได้รับการสนับสนุนทั้งหมดให้ดำเนินการต่อ
Jonathan Parker

อย่าลืมหนีตัวละครหนีเอง ...
Christoffer Hammarström

สองความคิดเห็น. ประการแรก Microsoft SQL มาจาก Sybase ดังนั้นความคล้ายคลึงกันจึงไม่ใช่เรื่องบังเอิญ ประการที่สองการหลีกเลี่ยงเครื่องหมายคำพูดเดียวกับคำพูดอื่นไม่ได้ จำกัด อยู่ที่LIKE; WHERE familyname = 'O''Toole'เช่น ประการที่สามตัวSIMILAR TOดำเนินการแนะนำนิพจน์ทั่วไปแบบไฮบริดประเภทหนึ่งซึ่งมีคุณลักษณะของตัวเอง (และอักขระพิเศษอื่น ๆ อีกมากมาย) ดังนั้นจึงไม่ควรรวมไว้ที่นี่ ฉันเดาว่ามี 3 ความคิดเห็น แต่ไม่มีใครคาดหวังว่าจะมีการสืบสวนของสเปน
Manngo

คำตอบ:


22

สำหรับ SQL Server จากhttp://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % สตริงใด ๆ ที่มีอักขระศูนย์ขึ้นไป

    WHERE title LIKE '%computer%' ค้นหาชื่อหนังสือทั้งหมดที่มีคำว่า 'คอมพิวเตอร์' ที่ใดก็ได้ในชื่อหนังสือ

  • _ อักขระเดี่ยวใด ๆ

    WHERE au_fname LIKE '_ean' ค้นหาชื่อตัวอักษรสี่ตัวที่ลงท้ายด้วย ean (Dean, Sean และอื่น ๆ )

  • [] อักขระเดี่ยวใด ๆ ภายในช่วงที่ระบุ ([af]) หรือชุด ([abcdef])

    WHERE au_lname LIKE '[C-P]arsen'ค้นหานามสกุลผู้แต่งที่ลงท้ายด้วย arsen และขึ้นต้นด้วยอักขระเดี่ยวใด ๆ ระหว่าง C และ P เช่น Carsen, Larsen, Karsen เป็นต้น ในการค้นหาช่วงอักขระที่รวมอยู่ในช่วงอาจแตกต่างกันไปขึ้นอยู่กับกฎการเรียงลำดับของการเรียง

  • [^] อักขระเดี่ยวใด ๆ ที่ไม่อยู่ในช่วงที่ระบุ ([^ af]) หรือชุด ([^ abcdef])

    WHERE au_lname LIKE 'de[^l]%' นามสกุลผู้แต่งทั้งหมดขึ้นต้นด้วย de และโดยที่ตัวอักษรต่อไปนี้ไม่ใช่ l


1
ฉันเพิ่งลองและดูเหมือนว่าคุณจะทำได้ แต่มันไม่เหมือนกับนิพจน์ทั่วไป => [0-9] แต่คุณต้องระบุแต่ละอักขระดังนี้: [0123456789]
Çağdaş Tekin

3
เดี๋ยวก่อนไม่มี มันเหมือนกับ RegEx ดังนั้น [0-9] ก็ใช้ได้เช่นกัน ขอโทษสำหรับความสับสน.
Çağdaş Tekin

6

ANSI SQL92 :

  • %
  • _
  • อักขระ ESCAPE หากระบุไว้เท่านั้น

เป็นที่น่าผิดหวังที่ฐานข้อมูลจำนวนมากไม่ยึดติดกับกฎมาตรฐานและเพิ่มอักขระพิเศษหรือเปิดใช้งาน ESCAPE อย่างไม่ถูกต้องโดยมีค่าเริ่มต้นเป็น "\" เมื่อไม่มี เหมือนเราไม่มีปัญหากับ '\' มากพอ!

เป็นไปไม่ได้ที่จะเขียนโค้ดที่ไม่ขึ้นกับ DBMS ที่นี่เนื่องจากคุณไม่รู้ว่าคุณจะต้องใช้อักขระใดในการหลบหนีและมาตรฐานระบุว่าคุณไม่สามารถหลีกหนีสิ่งที่ไม่จำเป็นต้องหลบหนีได้ (ดูหัวข้อ 8.5 / กฎทั่วไป / 3.a.ii.)

ขอบคุณ SQL! gnnn


5

คุณควรเพิ่มว่าคุณต้องเพิ่ม 'เพื่อหลีกเลี่ยงการมีอยู่' พิเศษใน SQL Server:

สมิ ธ -> สมิ ธ '


1

Sybase:

%              : Matches any string of zero or more characters.
_              : Matches a single character.
[specifier]    : Brackets enclose ranges or sets, such as [a-f] 
                 or [abcdef].Specifier  can take two forms:

                 rangespec1-rangespec2: 
                   rangespec1 indicates the start of a range of characters.
                   - is a special character, indicating a range.
                   rangespec2 indicates the end of a range of characters.

                 set: 
                  can be composed of any discrete set of values, in any 
                  order, such as [a2bR].The range [a-f], and the 
                  sets [abcdef] and [fcbdae] return the same 
                  set of values.

                 Specifiers are case-sensitive.

[^specifier]    : A caret (^) preceding a specifier indicates 
                  non-inclusion. [^a-f] means "not in the range 
                  a-f"; [^a2bR] means "not a, 2, b, or R."

0

คำตอบที่เป็นไปได้สำหรับ SQL Server

น่าสนใจฉันเพิ่งทำการทดสอบโดยใช้ LinqPad กับ SQL Server ซึ่งควรจะเรียกใช้ Linq เป็น SQL ที่อยู่ด้านล่างและสร้างคำสั่ง SQL ต่อไปนี้

บันทึกโดยที่ (r => r.Name.Contains ("lkjwer --_ ~ []"))

-- Region Parameters
DECLARE @p0 VarChar(1000) = '%lkjwer--~_~~~[]%'
-- EndRegion
SELECT [t0].[ID], [t0].[Name]
FROM [RECORDS] AS [t0]
WHERE [t0].[Name] LIKE @p0 ESCAPE '~'

ดังนั้นฉันจึงยังไม่ได้ทดสอบ แต่ดูเหมือนว่าESCAPE '~'คีย์เวิร์ดอาจอนุญาตให้มีการหลีกเลี่ยงสตริงโดยอัตโนมัติเพื่อใช้ภายในนิพจน์ like


พวกเขาอาจจะเพียงแค่ใช้ESCAPEเพราะจะช่วยให้การใช้สองตัวอักษรต่อตัวละครหนี (เช่น%กลายเป็น~%) แทนสาม (เช่นโดยไม่ต้องESCAPE, %กลายเป็น[%])
binki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.