Mengapa menggunakan karakter garis bawah dalam filter LIKE memberi saya semua hasil?

118

Saya menulis kueri SQL di bawah ini dengan LIKEsyarat:

SELECT * FROM Manager
WHERE managerid LIKE '_%'
AND managername LIKE '%_%'

Di bagian LIKESaya ingin mencari garis bawah %_%, tetapi saya tahu bahwa data kolom saya tidak memiliki karakter garis bawah.

  • Mengapa kueri memberi saya semua catatan dari tabel?

Contoh data:

create table Manager(
    id int
    ,managerid varchar(3)
    ,managername varchar(50)
    );

insert into Manager(id,managerid,managername)values(1,'A1','Mangesh');
insert into Manager(id,managerid,managername)values(2,'A2','Sagar');
insert into Manager(id,managerid,managername)values(3,'C3','Ahmad');
insert into Manager(id,managerid,managername)values(4,'A4','Mango');
insert into Manager(id,managerid,managername)values(5,'B5','Sandesh');

Sql-Fiddle

ABADI
sumber
1
Sangat menyenangkan menambahkan kueri sql-fiddle, tetapi Anda harus selalu menampilkan kueri di SO sebagai teks biasa. Jika tidak, pertanyaan ini rentan terhadap pembusukan tautan .
Tim Schmelter
_ :: Pengganti untuk satu karakter
vhadalgi
Kemungkinan duplikat dari SQL Server 2000/5 Escape an Underscore
kebiru

Jawaban:

193

Ubah WHEREkondisi Anda seperti ini:

WHERE mycolumn LIKE '%\_%' ESCAPE '\'

Ini adalah salah satu cara Oracle mendukung karakter melarikan diri. Di sini Anda menentukan karakter melarikan diri dengan escapekata kunci. Untuk detailnya lihat tautan ini di Oracle Docs .

The '_'dan '%'yang wildcard dalam LIKEpernyataan beroperasi di SQL.

The _karakter terlihat untuk kehadiran (ada) satu karakter tunggal. Jika Anda mencari oleh columnName LIKE '_abc', itu akan memberi Anda hasil dengan baris memiliki 'aabc', 'xabc', '1abc', '#abc'tapi tidak 'abc', 'abcc', 'xabcd'dan sebagainya.

The '%'karakter digunakan untuk pencocokan 0 atau lebih jumlah karakter. Itu berarti, jika Anda mencari oleh columnName LIKE '%abc', itu akan memberi Anda hasil dengan memiliki 'abc', 'aabc', 'xyzabc'dan sebagainya, namun tidak ada 'xyzabcd', 'xabcdd'dan string lain yang tidak berakhir dengan 'abc'.

Dalam kasus Anda, Anda telah mencari '%_%'. Ini akan memberikan semua baris dengan kolom itu memiliki satu atau lebih karakter, itu berarti karakter apa pun, sebagai nilainya. Inilah sebabnya mengapa Anda mendapatkan semua baris meskipun tidak ada _nilai kolom Anda.

Rachcha
sumber
Saya menghadapi masalah yang sama dalam akses Db. tolong beri tahu saya bagaimana saya bisa menyelesaikan masalah ini.
Mungkin Anda dapat menggunakan Google untuk 'wildcard in access db'. Saya tidak pernah mengerjakan Access, jadi saya tidak dapat membantu Anda. Saya bahkan ragu jika Access mendukung likeoperator. Solusi saya akan berfungsi di sebagian besar, jika tidak semua, database.
Rachcha
2
Apa yang tidak disebutkan di sini adalah bahwa ini juga berfungsi pada SQL Server - yang pada awalnya membuat saya bingung mengapa OP menerima jawaban untuk Oracle SQL, ketika mereka sendiri menandai pertanyaan untuk SQL Server. Setidaknya jawabannya harus ditulis terutama untuk menargetkan DBMS yang awalnya diberi tag.
underscore_d
87

Garis bawah adalah karakter pengganti dalamLIKE kueri untuk satu karakter arbitrer.

Karenanya LIKE %_%berarti "berikan saya semua catatan dengan setidaknya satu karakter arbitrer di kolom ini".

Anda harus keluar dari karakter wildcard, di sql-server dengan []sekitar:

SELECT m.* 
FROM Manager m 
WHERE m.managerid    LIKE  '[_]%'
AND   m.managername  LIKE '%[_]%'

Lihat: LIKE (Transact-SQL)

Demo

Tim Schmelter
sumber
Terima kasih telah memberikan tautan MSDN dalam jawaban Anda. Saya mengalami kesulitan menemukan informasi tentang menggarisbawahi karakter khusus sampai saya membaca posting Anda.
Chris Smith
5
Ini adalah jawaban yang benar karena pengguna menentukan sql-servertag dalam pertanyaan mereka dan SQLFiddle yang disediakan juga ditetapkan sebagai MS SQL Server 2008.
Govind Rai
8

Karena Anda ingin secara khusus mencari karakter wildcard, Anda harus menghindarinya

Ini dilakukan dengan menambahkan ESCAPEklausa ke LIKEekspresi Anda . Karakter yang ditentukan dengan ESCAPEklausa akan "membatalkan" karakter wildcard berikut.

Anda dapat menggunakan karakter apa pun yang Anda suka (bukan karakter wildcard). Kebanyakan orang menggunakan \karena itulah yang juga digunakan oleh banyak bahasa pemrograman

Jadi kueri Anda akan menghasilkan:

select * 
from Manager
where managerid LIKE '\_%' escape '\'
and managername like '%\_%' escape '\';

Tapi Anda juga bisa menggunakan karakter lain:

select * 
from Manager
where managerid LIKE '#_%' escape '#'
and managername like '%#_%' escape '#';

Berikut adalah contoh SQLFiddle: http://sqlfiddle.com/#!6/63e88/4

seekor kuda tanpa nama
sumber
5

Garis bawah adalah karakter pengganti untuk sesuatu. misalnya 'A_%' akan mencari semua kecocokan yang Mulai dengan 'A' dan memiliki minimal 1 karakter tambahan setelah itu

Franck
sumber
0

Anda dapat menulis kueri seperti di bawah ini:

SELECT * FROM Manager
WHERE managerid LIKE '\_%' escape '\'
AND managername LIKE '%\_%' escape '\';

itu akan menyelesaikan masalahmu.

Sonali Lad
sumber
Bagaimana ini menambahkan sesuatu di luar jawaban yang diterima?
Noah Broyles
0

Jika orang-orang menelusuri cara melakukannya di BigQuery:

  • Garis bawah "_" cocok dengan satu karakter atau byte.

  • Anda dapat keluar dari "\", "_", atau "%" menggunakan dua garis miring terbalik. Sebagai contoh, "\%". Jika Anda menggunakan string mentah, hanya diperlukan satu garis miring terbalik. Misalnya, r "\%".

WHERE mycolumn LIKE '%\\_%'

Sumber: https://cloud.google.com/bigquery/docs/reference/standard-sql/operators

p1nox
sumber