Dalam SQL I (sayangnya) sering harus menggunakan LIKE
kondisi " " karena database yang melanggar hampir setiap aturan normalisasi. Saya tidak bisa mengubahnya sekarang. Tapi itu tidak relevan dengan pertanyaan itu.
Selanjutnya, saya sering menggunakan kondisi seperti WHERE something in (1,1,2,3,5,8,13,21)
untuk keterbacaan yang lebih baik dan fleksibilitas pernyataan SQL saya.
Apakah ada cara yang mungkin untuk menggabungkan kedua hal ini tanpa menulis sub-seleksi yang rumit?
Saya menginginkan sesuatu semudah WHERE something LIKE ('bla%', '%foo%', 'batz%')
ini:
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'
Saya bekerja dengan SQl Server dan Oracle di sini, tetapi saya tertarik jika ini dimungkinkan di RDBMS sama sekali.
like any
/like all
: stackoverflow.com/questions/40475982/sql-like-any-vs-like-all . (Sebagai catatan, ini telah diminta di forum Oracle Community Ideas community.oracle.com/ideas/11592 )Jawaban:
Tidak ada kombinasi LIKE & IN di SQL, apalagi di TSQL (SQL Server) atau PLSQL (Oracle). Salah satu alasannya adalah karena Pencarian Teks Lengkap (FTS) adalah alternatif yang direkomendasikan.
Baik implementasi Oracle dan SQL Server FTS mendukung kata kunci CONTAINS, tetapi sintaksnya masih sedikit berbeda:
Peramal:
SQL Server:
Kolom yang Anda tanyakan harus diindeks teks lengkap.
Referensi:
sumber
Jika Anda ingin membuat pernyataan Anda mudah dibaca, maka Anda dapat menggunakan REGEXP_LIKE (tersedia dari Oracle versi 10 dan seterusnya).
Tabel contoh:
Sintaks asli:
Dan permintaan yang tampak sederhana dengan REGEXP_LIKE
TAPI ...
Saya tidak akan merekomendasikan sendiri karena kinerjanya yang tidak begitu baik. Saya akan tetap dengan beberapa predikat LIKE. Jadi contohnya hanya untuk bersenang-senang.
sumber
Anda terjebak dengan
kecuali Anda mengisi tabel temp (sertakan wild card dengan data) dan bergabunglah seperti ini:
coba (menggunakan sintaks SQL Server):
KELUARAN:
sumber
LIKE 'bla%'
, yang mana dalam kode contoh OP? atau hanya dapat melakukanLIKE '%bla%'
pencarian?Dengan PostgreSQL ada
ANY
atauALL
bentuk:atau
di mana subselect mengembalikan tepat satu kolom data.
sumber
LIKE ANY
danLIKE ALL
umum untuk semua dialek SQL, yaitu bagian dari bahasa inti, atau khusus untuk dialek?= ANY
atau<> ALL
tetapi hanya berfungsi dalam SQL, bukan dalam PLSQL misalnya.Solusi lain, harus bekerja pada RDBMS apa pun:
sumber
Saya menyarankan menggunakan fungsi pengguna TableValue jika Anda ingin merangkum teknik Inner Join atau tabel tempa yang ditunjukkan di atas. Ini akan memungkinkannya untuk membaca sedikit lebih jelas.
Setelah menggunakan fungsi pemisahan didefinisikan di: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx
kita dapat menulis yang berikut berdasarkan tabel yang saya buat bernama "Fish" (int id, varchar (50) Name)
Keluaran
sumber
Salah satu pendekatan akan menyimpan kondisi dalam tabel temp (atau variabel tabel di SQL Server) dan bergabung dengan yang seperti ini:
sumber
Gunakan gabung bagian dalam sebagai gantinya:
sumber
Teradata mendukung LIKE ALL / ANY syntax:
EDIT:
jOOQ versi 3.12.0 mendukung sintaks itu:
Tambahkan sintetis [TIDAK] SEPERTI APAPUN dan [TIDAK] SEPERTI SEMUA operator
PostgreSQL
LIKE/ILIKE ANY (ARRAY[])
:db <> demo biola
Snowflake juga mendukung LIKE ANY / LIKE ALL matching:
Contoh:
sumber
kamu bahkan dapat mencoba ini
Fungsi
Pertanyaan
sumber
Saya punya solusi sederhana, yang berfungsi di postgresql setidaknya, menggunakan
like any
diikuti oleh daftar regex. Berikut ini sebuah contoh, melihat mengidentifikasi beberapa antibiotik dalam daftar:sumber
Saya juga bertanya-tanya untuk sesuatu seperti itu. Saya baru saja diuji menggunakan kombinasi
SUBSTRING
danIN
dan itu adalah solusi yang efektif untuk masalah seperti ini. Coba kueri di bawah ini:sumber
Di Oracle Anda dapat menggunakan koleksi dengan cara berikut:
Di sini saya telah menggunakan tipe koleksi yang telah ditentukan
ku$_vcnt
, tetapi Anda dapat mendeklarasikan sendiri koleksi Anda seperti ini:sumber
Untuk Sql Server, Anda dapat menggunakan Dynamic SQL.
Sebagian besar waktu dalam situasi seperti itu Anda memiliki parameter klausa IN berdasarkan pada beberapa data dari database.
Contoh di bawah ini sedikit "dipaksakan", tetapi ini bisa cocok dengan berbagai kasus nyata yang ditemukan di database lawas.
Misalkan Anda memiliki tabel Orang di mana nama orang disimpan dalam satu bidang, PersonName sebagai FirstName + '' + LastName. Anda harus memilih semua orang dari daftar nama depan, disimpan di bidang NameToSelect di tabel NamesToSelect , ditambah beberapa kriteria tambahan (seperti difilter berdasarkan jenis kelamin, tanggal lahir, dll)
Anda dapat melakukannya sebagai berikut
sumber
Saya mungkin punya solusi untuk ini, meskipun hanya akan bekerja di SQL Server 2008 sejauh yang saya tahu. Saya menemukan bahwa Anda dapat menggunakan konstruktor baris yang dijelaskan di https://stackoverflow.com/a/7285095/894974 untuk bergabung dengan tabel 'fiksi' menggunakan klausa seperti. Kedengarannya lebih kompleks daripada itu, lihat:
Ini akan menghasilkan semua pengguna dengan alamat email seperti yang disediakan dalam daftar. Semoga bermanfaat bagi siapa pun. Masalahnya telah mengganggu saya beberapa saat.
sumber
Dimulai dengan 2016, SQL Server menyertakan
STRING_SPLIT
fungsi . Saya menggunakan SQL Server v17.4 dan saya membuatnya berfungsi:sumber
Jika Anda menggunakan MySQL yang terdekat dengan yang Anda dapatkan adalah pencarian teks lengkap:
Pencarian Teks Lengkap, Dokumentasi MySQL
sumber
Ini berfungsi untuk nilai yang dipisahkan koma
Mengevaluasi ke:
Jika Anda ingin menggunakan indeks, Anda harus menghilangkan
'%'
karakter pertama .sumber
Di Oracle RBDMS Anda dapat mencapai perilaku ini menggunakan fungsi REGEXP_LIKE .
Kode berikut akan menguji apakah string tiga hadir dalam ekspresi daftar satu | dua | tiga | empat | lima (di mana simbol pipa " | " berarti operasi logika ATAU).
Ekspresi sebelumnya setara dengan:
Jadi itu akan berhasil.
Di sisi lain, tes berikut akan gagal.
Ada beberapa fungsi yang terkait dengan ekspresi reguler (REGEXP_ *) yang tersedia di Oracle sejak versi 10g. Jika Anda seorang pengembang Oracle dan tertarik dengan topik ini, ini harus menjadi awal yang baik Menggunakan Ekspresi Reguler dengan Database Oracle .
sumber
Mungkin Anda berpikir kombinasi seperti ini:
Jika Anda telah menetapkan indeks teks lengkap untuk tabel target Anda, maka Anda dapat menggunakan alternatif ini:
sumber
Tidak ada jawaban seperti ini:
Di oracle tidak ada masalah.
sumber
Di Teradata Anda dapat menggunakan
LIKE ANY ('%ABC%','%PQR%','%XYZ%')
. Di bawah ini adalah contoh yang menghasilkan hasil yang sama untuk sayasumber
Saya tahu ini sangat terlambat, tetapi saya memiliki situasi yang sama. Saya membutuhkan operator "Suka Masuk" untuk serangkaian prosedur tersimpan yang saya miliki, yang menerima banyak parameter dan kemudian menggunakan parameter tersebut untuk mengumpulkan data dari beberapa sistem RDBMS, sehingga tidak ada trik khusus RDBMS yang akan bekerja, namun prosedur tersimpan dan fungsi apa pun akan berjalan di MS SQL Server, jadi kita bisa menggunakan T-SQL untuk fungsi menghasilkan pernyataan SQL lengkap untuk setiap RDBMS, tetapi hasilnya harus cukup RDBMS-independen.
Inilah yang saya buat untuk saat ini untuk mengubah string yang dibatasi (seperti parameter yang masuk ke prosedur tersimpan) menjadi blok SQL. Saya menyebutnya "Lichen" untuk "LIKE IN". Mengerti?
Lichen.sql
Deteksi pembatas mungkin direncanakan, tetapi untuk saat ini defaultnya adalah titik koma sehingga Anda bisa memasukkannya
default
ke sana. Mungkin ada bug dalam hal ini. The@leadingAnd
parameter hanya nilai bit untuk menentukan apakah Anda ingin "DAN" put terkemuka di depan blok sehingga cocok dengan baik dengan MANA penambahan klausa lainnya.Contoh Penggunaan (dengan pembatas di argString)
Akan mengembalikan nvarchar (512) yang berisi:
Itu juga akan melewati blok jika input tidak mengandung pembatas:
Contoh Penggunaan (tanpa pembatas di argString)
Akan mengembalikan nvarchar (512) yang berisi:
Saya akan terus mengerjakan ini, jadi jika saya telah mengabaikan sesuatu (sangat jelas atau sebaliknya), jangan ragu untuk berkomentar atau menjangkau.
sumber
melakukan hal ini
atau
sumber