452 Stimmen

Gibt es eine Kombination von "LIKE" und "IN" in SQL?

In SQL muss ich (leider) oft "LIKE"-Bedingungen verwenden, aufgrund von Datenbanken, die nahezu alle Regeln der Normalisierung verletzen. Das kann ich im Moment nicht ändern. Aber das ist irrelevant für die Frage.

Weiterhin verwende ich oft Bedingungen wie WHERE etwas in (1,1,2,3,5,8,13,21) für bessere Lesbarkeit und Flexibilität meiner SQL-Anweisungen.

Gibt es eine mögliche Möglichkeit, diese beiden Dinge ohne das Schreiben von komplizierten Unterabfragen zu kombinieren?

Ich möchte etwas so Einfaches wie WHERE etwas LIKE ('bla%', '%foo%', 'batz%') anstelle von diesem:

WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

Ich arbeite hier mit SQL Server und Oracle, aber ich bin interessiert, ob dies überhaupt in einem RDBMS möglich ist.

1 Stimmen

Du musst tun und mögen oder: UND (etwas WIE '%Ding%' oder etwas WIE '%Ding%' oder etwas WIE '%Ding%')

1 Stimmen

Ich wünschte, wir hätten Teradatas like any / like all: stackoverflow.com/questions/40475982/sql-like-any-vs-like-al‌​l. (Zur Erinnerung, dies wurde im Oracle Community Ideas-Forum angefordert community.oracle.com/ideas/11592)

0 Stimmen

0voto

Hong Van Vit Punkte 2662

Keine Antwort wie diese:

SELECT * FROM Tabelle WHERE etwas LIKE ('bla% %foo% batz%')

Bei Oracle kein Problem.

0voto

Piyush Verma Punkte 939

In Teradata können Sie LIKE ANY ('%ABC%','%PQR%','%XYZ%') verwenden. Nachfolgend finden Sie ein Beispiel, das bei mir die gleichen Ergebnisse erzielt hat.

--===========
--  ÜBERPRÜFUNG EINS
--===========
SELECT *
FROM Random_Table A
WHERE (Lower(A.TRAN_1_DSC) LIKE ('%american%express%centurion%bank%')
OR Lower(A.TRAN_1_DSC) LIKE ('%bofi%federal%bank%')
OR Lower(A.TRAN_1_DSC) LIKE ('%american%express%bank%fsb%'))

;
--===========
--  ÜBERPRÜFUNG ZWEI
--===========
SELECT *
FROM Random_Table  A
WHERE Lower(A.TRAN_1_DSC) LIKE ANY 
('%american%express%centurion%bank%',
'%bofi%federal%bank%',
'%american%express%bank%fsb%')

0voto

onupdatecascade Punkte 3306

Entschuldigung, dass ich einen alten Beitrag wieder hochgeholt habe, aber er hat viele Ansichten. Ich hatte diese Woche ein ähnliches Problem und kam auf dieses Muster:

declare @example table ( sampletext varchar( 50 ) );

insert @example values 
( 'The quick brown fox jumped over the lazy dog.' ),
( 'Ask not what your country can do for you.' ),
( 'Cupcakes are the new hotness.' );

declare @filter table ( searchtext varchar( 50 ) );

insert @filter values
( 'lazy' ),
( 'hotness' ),
( 'cupcakes' );

-- Erwarte Zeilen 1 und 3 zu bekommen, aber keine Duplikation von Cupcakes und Hotness
select * 
from @example e
where exists ( select * from @filter f where e.sampletext like '%' + searchtext + '%' )

Exists() funktioniert meiner Meinung nach etwas besser als join, da es einfach jeden Datensatz im Set testet, aber keine Duplikation verursacht, wenn es mehrere Treffer gibt.

0voto

gil.fernandes Punkte 11143

Dies ist mit Postgres möglich, indem like oder ilike und any oder all zusammen mit array verwendet werden. Dies ist ein Beispiel, das bei mir mit Postgres 9 funktioniert hat:

select id, name from tb_organisation where name ilike any (array['%wembley%', '%south%']);

Und das gibt aus:

 id  |          name
-----+------------------------
 433 | South Tampa Center
 613 | South Pole
 365 | Bromley South
 796 | Wembley Special Events
 202 | Southall
 111 | Wembley Inner Space

-3voto

Nikolay Hristov Punkte 11

Mach das

WO etwas + '%' in ('bla', 'foo', 'batz')
ODER '%' + etwas + '%' in ('tra', 'la', 'la')

oder

WO etwas + '%' in (select col from table where ....)

2 Stimmen

Wie soll das funktionieren? Die linke Seite ist ein String mit einem %, und dieses % ist daher kein Platzhalter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X