Je veux écrire une instruction SQL comme ci-dessous:
select * from tbl where col like ('ABC%','XYZ%','PQR%');
Je sais que cela peut être fait en utilisant OR
. Mais je veux savoir s'il existe une meilleure solution.
Voici un autre moyen:
select * from tbl where col like 'ABC%'
union
select * from tbl where col like 'XYZ%'
union
select * from tbl where col like 'PQR%';
Voici le code de test à vérifier:
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)
C'est un bon usage d'une table temporaire.
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);
Dans les exemples de modèle, il est impossible que col
puisse correspondre à plus d'un modèle. Vous pouvez donc être sûr de voir chaque ligne de tbl
au plus une fois dans le résultat. Mais si vos modèles sont tels que col
puisse correspondre à plusieurs, vous devez utiliser le modificateur de requête DISTINCT
.
SELECT DISTINCT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern);
Oracle 10g dispose de fonctions permettant d'utiliser des expressions régulières SQL compatibles avec POSIX:
Voir Oracle Database SQL Reference pour les détails sur la syntaxe de cette fonction.
Jetez un coup d'œil à Expressions régulières en Perl avec des exemples.
Code:
select * from tbl where regexp_like(col, '^(ABC|XYZ|PQR)');
Cela pourrait aider:
select * from tbl where col like '[ABC-XYZ-PQR]%'
J'ai utilisé cela dans SQL Server 2005 et cela a fonctionné.
select * from tbl where col like 'ABC%'
or col like 'XYZ%'
or col like 'PQR%';
Cela fonctionne dans crapaud et powerbuilder. Je ne sais pas pour le reste
J'avais également la même exigence, où je n'avais pas le choix de passer plusieurs fois comme opérateur, soit en faisant une requête OR, soit en écrivant une requête d'union.
This worked for me in Oracle 11g:
REGEXP_LIKE (column, 'ABC.*|XYZ.*|PQR.*');
SELECT * De tbl WHERE col LIKE '[0-9, a-z]%';
utilisez simplement cette condition de comme en sql et vous obtiendrez votre réponse souhaitée
Si votre valeur de paramètre n'est pas fixe ou si votre valeur peut être nulle en fonction des entreprises, vous pouvez essayer l'approche suivante.
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
Fonction SplitString
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;
Même tu peux essayer ça
Une fonction
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
Question
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+'%';