Ich möchte eine SQL-Anweisung wie folgt schreiben:
select * from tbl where col like ('ABC%','XYZ%','PQR%');
Ich weiß, dass es mit gemacht werden kann OR
. Aber ich möchte wissen, ob es eine bessere Lösung gibt.
Ich möchte eine SQL-Anweisung wie folgt schreiben:
select * from tbl where col like ('ABC%','XYZ%','PQR%');
Ich weiß, dass es mit gemacht werden kann OR
. Aber ich möchte wissen, ob es eine bessere Lösung gibt.
Antworten:
Hier ist ein alternativer Weg:
select * from tbl where col like 'ABC%'
union
select * from tbl where col like 'XYZ%'
union
select * from tbl where col like 'PQR%';
Hier ist der zu überprüfende Testcode:
create table tbl (col varchar(255));
insert into tbl (col) values ('ABCDEFG'), ('HIJKLMNO'), ('PQRSTUVW'), ('XYZ');
select * from tbl where col like 'ABC%'
union
select * from tbl where col like 'XYZ%'
union
select * from tbl where col like 'PQR%';
+----------+
| col |
+----------+
| ABCDEFG |
| XYZ |
| PQRSTUVW |
+----------+
3 rows in set (0.00 sec)
Dies ist eine gute Verwendung einer temporären Tabelle.
CREATE TEMPORARY TABLE patterns (
pattern VARCHAR(20)
);
INSERT INTO patterns VALUES ('ABC%'), ('XYZ%'), ('PQR%');
SELECT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern);
In den Beispielmustern kann nicht col
mehr als ein Muster übereinstimmen, sodass Sie sicher sein können, dass jede Zeile tbl
höchstens einmal im Ergebnis angezeigt wird. Wenn Ihre Muster jedoch so sind, dass col
sie mit mehreren übereinstimmen können, sollten Sie den DISTINCT
Abfragemodifikator verwenden.
SELECT DISTINCT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern);
Oracle 10g verfügt über Funktionen, die die Verwendung von POSIX-kompatiblen regulären Ausdrücken in SQL ermöglichen:
Siehe die Oracle Database SQL-Referenz Informationen zur Syntax dieser Funktionen finden .
Schauen Sie sich reguläre Ausdrücke in Perl an mit Beispielen an.
Code:
select * from tbl where regexp_like(col, '^(ABC|XYZ|PQR)');
LIKE 'ABC%'
aber ich glaube nicht, dass es einen Index für REGEX-Operationen verwenden kann (es sei denn, es ist ein funktionsbasierter Index)
select * from tbl where col like 'ABC%'
or col like 'XYZ%'
or col like 'PQR%';
Dies funktioniert in Kröte und Powerbuilder. Ich weiß nichts über den Rest
Dies könnte helfen:
select * from tbl where col like '[ABC-XYZ-PQR]%'
Ich habe dies in SQL Server 2005 verwendet und es hat funktioniert.
Sogar du kannst es versuchen
Funktion
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20))
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
Abfrage
select * from my_table inner join (select value from fn_split('ABC,MOP',','))
as split_table on my_table.column_name like '%'+split_table.value+'%';
Wenn Ihr Parameterwert nicht festgelegt ist oder Ihr Wert geschäftlich null sein kann, können Sie den folgenden Ansatz ausprobieren.
DECLARE @DrugClassstring VARCHAR(MAX);
SET @DrugClassstring = 'C3,C2'; -- You can pass null also
---------------------------------------------
IF @DrugClassstring IS NULL
SET @DrugClassstring = 'C3,C2,C4,C5,RX,OT'; -- If null you can set your all conditional case that will return for all
SELECT dn.drugclass_FK , dn.cdrugname
FROM drugname AS dn
INNER JOIN dbo.SplitString(@DrugClassstring, ',') class ON dn.drugclass_FK = class.[Name] -- SplitString is a a function
SplitString-Funktion
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER FUNCTION [dbo].[SplitString](@stringToSplit VARCHAR(MAX),
@delimeter CHAR(1) = ',')
RETURNS @returnList TABLE([Name] [NVARCHAR](500))
AS
BEGIN
--It's use in report sql, before any change concern to everyone
DECLARE @name NVARCHAR(255);
DECLARE @pos INT;
WHILE CHARINDEX(@delimeter, @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(@delimeter, @stringToSplit);
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1);
INSERT INTO @returnList
SELECT @name;
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos);
END;
INSERT INTO @returnList
SELECT @stringToSplit;
RETURN;
END;
SELECT * From tbl WHERE col LIKE '[0-9, az]%';
Verwenden Sie einfach diese Bedingung wie in SQL und Sie erhalten Ihre gewünschte Antwort