Pilih beberapa nilai di LIKE Operator

10

Saya memiliki query SQL yang diberikan di bawah ini, saya ingin memilih beberapa nilai menggunakan likeoperator.

Apakah Query saya benar?

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

Jika tidak, adakah yang bisa mengoreksi saya?

Tabel saya memiliki sejumlah besar data yang dimulai dengan 'emp1'dan 'emp3'. Dapatkah saya memfilter berdasarkan 3 "emp1" dan 2 "emp3" teratas berdasarkan rx_dt?

llijith
sumber

Jawaban:

16

Atau Anda dapat mencoba metode berikut:

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
;

The VALUESbaris konstruktor merupakan daftar pola Anda sebagai meja, juga memasok masing-masing pola dengan jumlah baris untuk mengambil untuk pola itu. Operator CROSS APPLY menerapkan kueri Anda ke setiap baris dari daftar pola, yaitu untuk setiap pola, membatasi jumlah baris untuk setiap pola dengan nilai yang sesuai dari daftar pola.

Sebagai catatan tambahan, izinkan saya mengambil kesempatan ini untuk menyarankan agar Anda selalu memenuhi syarat kolom Anda dengan alias tabel dalam kueri yang membaca dari dua atau lebih tabel. Itu membuat kueri Anda lebih mudah dibaca / dimengerti. Anda selalu dapat menggunakan alias pendek untuk menghindari pengulangan nama tabel yang berpotensi panjang. Contohnya:

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
  ...
Andriy M
sumber
6

Anda harus menggunakan ketentuan ATAU / DAN:

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;

Lihat OR (Transact-SQL) di MS-Documents.

Saya telah membuat contoh:

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 | nama karyawan  
: ---------- | : --------------
emp10 | Bryan Nelson   
emp12 | Rosalyn Sanders
emp13 | Rose Tudler    
emp30 | Ian McGregor   

Ingatlah bahwa Anda menggunakan TOP 1, Anda akan mendapatkan satu baris maksimum, tidak peduli berapa banyak kondisi yang Anda gunakan.

SELECT TOP 1 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
employee_id | nama karyawan
: ---------- | : ------------
emp10 | Bryan Nelson

Jika Anda membutuhkan baris TOP (X) WHERE employee_id LIKE 'emp1%'ditambah baris TOP (X), WHERE employee_id LIKE 'emp3%'Anda dapat menggunakan dua pernyataan pilih yang bergabung dengan UNION ALL.

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 | nama karyawan  
: ---------- | : --------------
emp10 | Bryan Nelson   
emp12 | Rosalyn Sanders
emp13 | Rose Tudler    
emp30 | Ian McGregor   

Selain itu saya akan menambahkan pencarian pola, tetapi solusi ini mengembalikan semua catatan yang cocok dengan pola: SEPERTI 'emp [13]%'

SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp[13]%'
GO
employee_id | nama karyawan  
: ---------- | : --------------
emp10 | Bryan Nelson   
emp12 | Rosalyn Sanders
emp13 | Rose Tudler    
emp30 | Ian McGregor   

Aku di sini

McNets
sumber
2

Saya kira Anda ingin 1 baris where employee_id like 'emp1%'dan satu lagi where employee_id like 'emp3%'. Salah satu cara untuk mencapai ini adalah dengan menggunakan 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 ;

Karena kaki-kaki dalam serikat dijamin terpisah, UNION ALLdapat digunakan, dan itu mungkin merupakan keuntungan kinerja dibandingkan dengan hanya menggunakan a UNION.

Saya percaya SQL-server 2008 mendukung fungsi jendela seperti row_number (), sehingga Anda dapat menggunakan sesuatu seperti:

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;
Lennart
sumber
-2

Anda menggunakan TOP(1)dan order byklausa. Jadi, Anda hanya akan mendapatkan rekor teratas pertama yang dipesan oleh klausa.

Ashmita Jain
sumber