2010-05-19 42 views
5

Tôi cần phải viết một trình phân tích cú pháp logic boolean sẽ dịch ngôn ngữ logic boolean thành mệnh đề SQL WHERE.Làm cách nào để phân tích cú pháp logic boolean?

Thứ tự của toán hạng sẽ luôn theo thứ tự đúng (có giá trị ở bên phải).

Đây là một ví dụ tương đối đơn giản. Có thể có các dấu ngoặc đơn lồng nhau và sử dụng các toán tử NOT, v.v.

(CACOUNT=01 OR CACOUNT=02 OR CACOUNT=03) 
AND Q4=1 AND NAME=TIMOTHY 

Đây là mệnh đề WHERE sẽ giống như thế nào.

WHERE (
    EXISTS (
     SELECT 1 FROM MyVerticalTable b 
     WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='01' 
    ) 
    OR EXISTS (
     SELECT 1 FROM MyVerticalTable b 
     WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='02' 
) 
    OR EXISTS (
     SELECT 1 FROM MyVerticalTable b 
     WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='03' 
) 
) 
AND EXISTS (
     SELECT 1 FROM MyVerticalTable b 
     WHERE b.Key=a.Key AND b.Key='Q4' AND b.Value='1' 
) 
AND EXISTS (
     SELECT 1 FROM MyVerticalTable b 
     WHERE b.Key=a.Key AND b.Key='NAME' AND b.Value='TIMOTHY' 
) 
+3

Không thể chỉ vào mệnh đề 'where'? – tzaman

+0

Không, nó thực sự không thể nào cả. Không có cột có tên CACOUNT. Đó là một bảng dọc. –

+0

bảng dọc là gì? – Andrey

Trả lời

2

tốt, điều gì xảy ra sau biểu thức boolean, vì vậy bạn cần dịch với các thay thế đơn giản, không phân tích cú pháp. đối với mẫu của bạn, bạn chỉ cần đặt các trích dẫn đến cùng: NAME = 'TIMOTHY'

+0

Điều này sẽ không hoạt động khá dễ dàng như vậy –

1

Viết ngữ pháp cho ngôn ngữ và tạo trình phân tích cú pháp gốc đệ quy. Đây là cách dễ nhất để phân tích cú pháp "ngôn ngữ" đơn giản như biểu thức boolean.

Khi bạn đã phân tích cú pháp nó thành AST của bạn (cây cú pháp trừu tượng), thì bạn có thể thực hiện bất kỳ biến đổi nào là cần thiết và tạo mệnh đề SQL WHERE.

+0

Làm cho trình phân tích cú pháp gốc đệ quy là nơi tôi gặp phải sự cố nhất; cụ thể với dấu ngoặc đơn –

+0

Trước tiên, hãy làm [ngữ pháp] của bạn (http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form). Khi ngữ pháp của bạn hoàn tất, thì trình phân tích cú pháp gốc đệ quy rất đơn giản. –

+0

Làm thế nào để biến ngữ pháp của tôi thành mã C#? –

0

sau khi chỉnh sửa mọi thứ đã thay đổi. bạn vẫn không cần khoa học tên lửa. viết cụm từ thông dụng, như sau: (\ w +) = ([\ w \ d] +), sau đó thay thế từng kết quả phù hợp bằng

EXISTS (
     SELECT 1 FROM MyVerticalTable b 
     WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2' 
) 
Các vấn đề liên quan