2010-10-21 29 views
5

Với bảng cơ sở dữ liệu sau đây:Có cách nào tốt hơn để tìm đảo chữ cái bằng SQL?

WORDS 
alphagram....varchar(15) 
word.........varchar(15) PK 
length.......int 

đâu:

  • 'alphagram' là các chữ cái của một từ trong thứ tự chữ cái (ví dụ AEINNRTT là alphagram của INTRANET)
  • khóa chính là 'từ' và có các chỉ mục trên alphagram và chiều dài

Tôi đã tìm thấy cách để tìm đảo chữ cái của một chuỗi ký tự đã cho s thông qua SQL. Ví dụ, để tìm cách đảo chữ cái của AEINNRTT này sẽ làm việc:

select alphagram, word, definition 
from words 
where length = 8 
and alphagram like '%A%' 
and alphagram like '%E%' 
and alphagram like '%I%' 
and alphagram like '%NN%' 
and alphagram like '%R%' 
and alphagram like '%TT%' 

Đó sẽ trở lại 1 hàng (đối với INTRANET)

Và nếu tôi muốn bao gồm một số tiếng của các kí hiệu, ví dụ, có bao nhiêu từ là với INTRANET + một trống (ký tự đại diện) Tôi chỉ phải thay đổi 'độ dài' thành tổng số chữ cái + số thẻ hoang dã

ví dụ

select alphagram, word, definition 
from words 
where length = 9 
and alphagram like '%A%' 
and alphagram like '%E%' 
and alphagram like '%I%' 
and alphagram like '%NN%' 
and alphagram like '%R%' 
and alphagram like '%TT%' 

... sẽ trở lại 8 hàng (giải trí, INSTANTER, trọn vẹn, mạng nội bộ, lưu động, NATTERING, RATTENING, và thoáng qua)

Câu hỏi của tôi là thế này: là có một cách hiệu quả hơn để làm điều này chỉ qua SQL?

Điều này hoạt động khá nhanh trong SQLServer nhưng khá chậm trong SqlLite. Tôi nhận thấy rằng các tìm kiếm% xxx% không nhanh.

+0

Có lý do nào bạn chỉ sử dụng SQL thay vì lớp ứng dụng không? – JNK

+0

Tôi đang cố giữ mọi thứ đơn giản, nhưng tôi có thể sẽ phải đi theo con đường đó. – eponymous23

Trả lời

0

Một ý tưởng là để làm điều đó như thế này (đối với chiều dài từ nhất định):

  • chia từ vào đặc điểm cá nhân (có thể sử dụng SUBSTRING() trong vòng một, mặc dù một cách tiếp cận tốt hơn có lẽ là giá trị riêng biệt nhắm mục tiêu SO câu hỏi)

  • generate all permutations

  • LỢI NHUẬN!

Mặc dù, như một commenter nói, tôi muốn khuyên bạn làm điều đó SQL bên ngoài trừ khi bạn có lý do rất chính đáng không hay bạn chỉ cần làm điều này để thử thách kỹ năng của bạn.

2

Bạn có thể tạo một loại cột chỉ mục cho mỗi mục nhập có tất cả các chữ cái của từ theo thứ tự bảng chữ cái và sau đó so sánh chúng. Mỗi đảo chữ cái sẽ có cùng giá trị chỉ mục.

0

Cách tốt nhất mà tôi đã tìm ra để thực hiện việc này là: Tôi đã tạo các cột ...z và phân tích từng từ và đếm số lần xuất hiện của một chữ cái và đặt nó theo cột tương ứng tiếp theo khi tôi nhập từ để xắp xếp lại, tôi tính từng lần xuất hiện của mỗi chữ cái đó và so sánh nó với các từ trong cơ sở dữ liệu Đây có thể là một chút khó hiểu cho tôi biết nếu bạn cần làm rõ hơn nữa

0

câu hỏi này là cũ và tôi có thể hiểu lầm gì đó, nhưng có vẻ như yêu cầu đầu tiên của bạn có thể

select alphagram, word, definition 
from words 
where length = 8 
and alphagram = 'AEINNRTT' and word <> alphagram 

này hoạt động vì tất cả các đảo chữ cái có cùng độ dài đều có cùng một chữ cái. Nó sẽ sử dụng chỉ mục trên bảng chữ cái và rất nhanh.

cho độ dài> 8 trường hợp, khó có kịch bản dễ dàng hơn, nhưng tôi sẽ thử thêm 26 cột vào bảng: alpha_a, alpha_b, .. chứa số của mỗi chữ cái trong chữ cái. Mỗi chỉ số có thể có chỉ mục và sau đó bạn tìm kiếm

select alphagram, word, definition 
from words 
where length = 9 
and alpha_a >= 1 
and alpha_e >= 1 
and alpha_i >= 1 
and alpha_n >= 2 
and alpha_r >= 1 
and alpha_t >= 2 
Các vấn đề liên quan