2009-09-07 10 views
54

で複数の条件を導入することができますは、どのように私は以下のようなSQL文を書きたいLIKE演算子

select * from tbl where col like ('ABC%','XYZ%','PQR%'); 

私はそれがORを使用して行うことができます知っています。しかし、もっと良い解決策があるかどうかを知りたい。ここで

+1

ORに問題がありますか?あるいは動的な条件がありますか? –

+0

ORで何が問題になっていますか?入力の量? –

+1

明らかに、私はリアルタイムでORを使用しました。しかし、私は代わりに他の方法があることを知りたいです – Madhu

答えて

35

は別の方法である:ここでは

select * from tbl where col like 'ABC%' 
union 
select * from tbl where col like 'XYZ%' 
union 
select * from tbl where col like 'PQR%'; 

は、検証するためのテストコードです:

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) 
57

これは一時的なテーブルの良い使用です。例のパターンで

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); 

、あなたはその結果で、最高1回tblの各列が表示されますことを確認することができますのでcolは、複数のパターンに一致することができる方法はありません。しかし、パターンがcolが複数のパターンと一致するパターンの場合は、DISTINCTクエリ修飾子を使用する必要があります。

SELECT DISTINCT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern); 
+0

これはPostgreSQLユーザでは機能しません – LittleBobbyTables

4

これは役立つかもしれない:

select * from tbl where col like '[ABC-XYZ-PQR]%' 

私は、SQL Server 2005で、これを使ってきたし、それが働きました。

+6

無関係の結果はありませんか? – NileshChauhan

+0

部分的に一致するコードをデータセットから引き出すのに最適です。同じ基本コードに文字を付加して地理的位置を表す – Hilary

3
select * from tbl where col like 'ABC%' 
or col like 'XYZ%' 
or col like 'PQR%'; 

これはtoadとpowerbuilderで動作します。残り

+2

実際にOPが使用した構文です。彼らはその定式化に*代替案*を望んでいた。 – APC

+0

Oracle SQL開発者でも動作します。 – Shams

35

のOracle 10gは、SQLでのPOSIX準拠の正規表現の使用を許可する機能を持っていることは知らない:

  • REGEXP_LIKE
  • REGEXP_REPLACE
  • REGEXP_INSTR
  • REGEXP_SUBSTR

この機能の構文の詳細については、Oracle Database SQL Referenceを参照してください。

Regular expressions in Perlを参考にしてください。

コード:

select * from tbl where regexp_like(col, '^(ABC|XYZ|PQR)'); 
+1

Oracleは確かに 'LIKE 'ABC%''の索引を使用できますが、ファンクション索引でない限り、REGEX操作に索引を使用できるとは思いません。 – symcbean

2

また、私はORを行っているか、ユニオンクエリを書くことのいずれかによって、オペレータのように複数回に合格する選択肢を持っていなかった同じ要件を持っていました。お使いのパラメータ値が固定されていないか、値がnullのことができます。ビジネスに基づいて行うことができる場合

This worked for me in Oracle 11g: 

REGEXP_LIKE (column, 'ABC.*|XYZ.*|PQR.*'); 
0

さえuが

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 

クエリ

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+'%'; 
0

この

機能を試すことができます次のアプローチを試してください。

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機能

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)[email protected]); 
      END; 
     INSERT INTO @returnList 
       SELECT @stringToSplit; 
     RETURN; 
    END; 
0

SELECT * COL LIKE '[0-9、-Z]は%' TBL から。

このようなSQLのような条件を使用すると、ご希望の回答が得られます

関連する問題