LIKE演算子で複数の値を選択する


10

以下に示すSQLクエリがありますlike。演算子を使用して複数の値を選択します。

私のクエリは正しいですか?

SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
FROM       employee
INNER JOIN employee_mdata_history 
ON         employee.ident=employee_mdata_history.employee_ident 
WHERE      employee_id like 'emp1%' , 'emp3%' 
ORDER BY   rx_dt desc

そうでない場合、誰かが私を修正できますか?

テーブルには、'emp1'およびで始まる大量のデータがあり'emp3'ます。結果を上位3「emp1」と上位2「emp3」でフィルタリングできますrx_dtか?

回答:


16

または、次の方法を試すこともできます。

SELECT
  x.*
FROM
  (
    VALUES
      ('emp1%', 3),
      ('emp3%', 2)
  ) AS v (pattern, row_count)
  CROSS APPLY
  (  -- your query
    SELECT top (v.row_count)
               employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    INNER JOIN employee_mdata_history
    ON         employee.ident=employee_mdata_history.employee_ident 
    WHERE      employee_id like v.pattern
    ORDER BY   rx_dt desc
  ) AS x
;

VALUES行コンストラクタは、さらに、そのパターンを取得する行の数と各パターンの供給、テーブルとしてのパターンリストを表します。CROSS APPLY演算子は、クエリをパターンリストのすべての行、つまりすべてのパターンに適用し、各パターンの行数をパターンリストの対応する値に制限します。

ちなみに、この機会に、2つ以上のテーブルから読み取るクエリでは、常に列をテーブルエイリアスで修飾することをお勧めします。これにより、クエリが読みやすくなり、理解しやすくなります。長いエイリアスを繰り返し使用しないように、常に短いエイリアスを使用できます。例えば:

SELECT TOP (1)
  e.employee_id,
  h.employee_ident,
  ...
FROM
  dbo.employee AS e
  INNER JOIN dbo.employee_mdata_history AS h
    ON e.ident = h.employee_ident
WHERE
  e.employee_id LIKE ...
ORDER BY
  ...

6

OR / AND条件を使用する必要があります。

SELECT TOP (1) 
           employee_id, employee_ident, utc_dt, rx_dt 
FROM       employee
INNER JOIN employee_mdata_history 
ON         employee.ident = employee_mdata_history.employee_ident 
WHERE      employee_id like 'emp1%' 
OR         employee_id like 'emp3%' 
ORDER BY   rx_dt desc;

見ていOR(のTransact-SQL) MS-ドキュメント上を。

私は例を設定しました:

create table employees(employee_id varchar(10), employee_name varchar(100));

insert into employees values
('emp10', 'Bryan Nelson'),
('emp12', 'Rosalyn Sanders'),
('emp13', 'Rose Tudler'),
('emp20', 'Julio Gomez'),
('emp30', 'Ian McGregor'),
('emp40', 'Anne Hatt');
GO
SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
employee_id | 従業員名  
:---------- | :--------------
emp10 | ブライアンネルソン   
emp12 | ロザリン・サンダース
emp13 | ローズタドラー    
emp30 | イアン・マクレガー   

TOP 1を使用していることに注意してください。使用する条件の数に関係なく、最大で1行を取得します。

SELECT TOP 1 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
employee_id | 従業員名
:---------- | :------------
emp10 | ブライアンネルソン

TOP(X)行WHERE employee_id LIKE 'emp1%'とTOP(X)行がWHERE employee_id LIKE 'emp3%'必要な場合は、UNION ALLで結合された2つの選択ステートメントを使用できます。

SELECT TOP 3 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
UNION ALL
SELECT TOP 1 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp3%'
GO
employee_id | 従業員名  
:---------- | :--------------
emp10 | ブライアンネルソン   
emp12 | ロザリン・サンダース
emp13 | ローズタドラー    
emp30 | イアン・マクレガー   

さらに、パターン検索を追加しますが、このソリューションはパターンに一致するすべてのレコードを返します。LIKE 'emp [13]%'

SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp[13]%'
GO
employee_id | 従業員名  
:---------- | :--------------
emp10 | ブライアンネルソン   
emp12 | ロザリン・サンダース
emp13 | ローズタドラー    
emp30 | イアン・マクレガー   

ここ dbfiddle


2

私はあなたが1行where employee_id like 'emp1%'と別の行を望んでいると思いますwhere employee_id like 'emp3%'。これを達成する1つの方法は、使用することですunion

SELECT t1.*
FROM
  ( SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    JOIN employee_mdata_history 
        ON employee.ident=employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp1%'
    ORDER BY rx_dt desc
  ) AS t1
UNION ALL
SELECT t2.*
FROM
  (  SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    JOIN employee_mdata_history 
        ON employee.ident=employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp3%'
    ORDER BY rx_dt desc
  ) AS t2 ;

unionのレッグは互いに素であるUNION ALLことが保証されているので、a を使用できますUNION

SQL Server 2008はrow_number()などのウィンドウ関数をサポートしているので、次のようなものを使用できます。

SELECT employee_id, employee_ident, utc_dt, rx_dt
FROM (
    SELECT employee_id, employee_ident, utc_dt, rx_dt
      , row_number() over (partition by substring(employee_id,1,4)
                           order by rx_dt desc) as rn 
    FROM employee
    JOIN employee_mdata_history 
        ON employee.ident = employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp1%' 
       OR employee_id like 'emp3%'
) as T 
WHERE rn = 1 
ORDER BY rx_dt desc;

-2

TOP(1)and order by句を使用しています。したがって、句によって順序付けられた最初の上位レコードのみが取得されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.