2011-10-27 62 views
7

Tôi có một dự án có thể sử dụng SQL Server hoặc MS Access làm kho dữ liệu. Trong một câu lệnh SELECT, tôi phải thực hiện một hoạt động liên hiệp trên một cột duy nhất và một giá trị duy nhất, như thế này:Hàm COALESCE, IFNULL hoặc NZ() có thể được sử dụng trong SQL Server và MS Access

SELECT COALESCE([Amount], 0) FROM PaymentsDue; 

Tôi muốn viết một câu lệnh SQL duy nhất mà sẽ thực hiện một cách chính xác trong cả SQL Server và MS Access . Phiên bản SQL Server được quan tâm ngay lập tức là năm 2008, mặc dù một giải pháp áp dụng trên các phiên bản sẽ được ưu tiên hơn.

Trước đó ngày hôm nay, ai đó đã có thể to show me an SQL trick cho phép tôi sử dụng một câu lệnh SELECT để có hiệu quả CAST từ DATETIME đến DATE. Tôi đã tự hỏi nếu có ai có một thủ thuật tương tự để thực hiện một hoạt động (ví dụ, IFNULL hoặc NZ) hoạt động theo cách có thể được áp dụng cho cả hai SQL Server và MS Access?

Trả lời

6

này sẽ làm việc, nhưng nó vụng về:

SELECT Amount 
FROM PaymentsDue 
WHERE Amount IS NOT NULL 
UNION ALL 
SELECT 0 AS Amount 
FROM PaymentsDue 
WHERE Amount IS NULL 

Rõ ràng nếu bạn có nhiều hơn một cột, điều này được cho là một cách nhanh chóng không thể quản lý.

+1

Phần 'Amount = 0' sẽ không hoạt động trong Access. Nó phải là '0 AS Amount'. –

+0

Tôi đã đi với một biến thể của giải pháp này. Nhu cầu trước mắt của tôi là thực hiện một 'INSERT. . . LỰA CHỌN. . .' và tôi đơn giản lặp lại câu lệnh hai lần, một lần cho NULL và một lần cho các hàng khác. –

5

Tôi không nghĩ có bất kỳ cú pháp nào hoạt động giống nhau trên cả hai nền tảng.

Lưu ý Nz() chỉ khả dụng khi sử dụng giao diện người dùng Access.

Dưới đây là một vài ý kiến ​​cho rằng có thể được chuyển thành COALESCE khá dễ dàng, mặc dù lặp lại những cột là một nỗi đau:

Mẫu 1:

SELECT IIF([Amount] IS NULL, 0, [Amount]) FROM PaymentsDue; 

Mẫu 2:

SELECT SWITCH([Amount] IS NULL, 0, TRUE, [Amount]) FROM PaymentsDue; 
0

Và tôi đoán bạn không muốn viết một trình phân tích cú pháp sẽ quản lý bản dịch giữa Jet SQL và T-SQL ...

Một giải pháp mà chúng tôi phát triển (có, chúng tôi đã có một vấn đề tương tự để giải quyết) là xác định một số 'pseudo-metalanguage' mà chúng tôi sử dụng trong cú pháp meta-SQL của chúng tôi, và chúng tôi có một loại dịch từ siêu ngôn ngữ này vào Jet SQL hoặc T-SQL.

Ví dụ:

myQuery = "SELECT @[email protected]([Amount], 0) FROM PaymentsDue;" 

myQuery = convertFromMeta(myQuery,"T-SQL") 
will give 
    "SELECT COALESCE([Amount], 0) FROM PaymentsDue;" 

myQuery = convertFromMeta(myQuery,"JET-SQL") 
will give 
    "SELECT NZ([Amount], 0) FROM PaymentsDue;" 

Chiến lược tương tự có thể được sử dụng cho các kí hiệu và delimiters:

myQuery = "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE @[email protected]@[email protected]@[email protected]" 

myQuery = convertFromMeta(myQuery,"T-SQL") 
will give 
    "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE 'ABC%'" 

myQuery = convertFromMeta(myQuery,"JET-SQL") 
will give 
    "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE "ABC%"" 

tôi konw nó không phải là tốt đẹp, nhưng nó là khá hiệu quả và sạch sẽ. Các điểm chính là:

  • Chúng tôi không dịch giữa Jet và T-SQL, nhưng từ 'cú pháp meta'. Nó làm cho mọi thứ trở nên dễ dàng hơn rất nhiều
  • Cần phải rất cẩn thận khi các hàm không có cùng số tham số hoặc khi các tham số không được truyền theo cùng thứ tự. Nó vẫn có thể được thực hiện ...
  • Cú pháp meta của chúng tôi dựa trên thực tế là các chuỗi tương ứng (như '@ MyWildCard @' hoặc '@ CarSep @') cụ thể cho cú pháp của chúng tôi và không thể được sử dụng làm giá trị dữ liệu (nếu không, chúng tôi sẽ phải quản lý một số rủi ro 'siêu tiêm'! ...)
+0

Bạn đúng là tôi không muốn viết trình phân tích cú pháp của riêng mình! Tôi đã nghĩ về cách viết * máy phát * của riêng tôi, tuy nhiên, dọc theo dòng của những gì bạn đề nghị (nhưng hoạt động trên các đối tượng, chứ không phải là dây). Trong một phần khác của ứng dụng của tôi, tôi phát hành DDL để thêm các tính năng mới vào cơ sở dữ liệu phải cụ thể cho động cơ; mà sẽ được hưởng lợi từ (và tương đối dễ dàng để) sử dụng một máy phát điện. Nếu tôi đã làm điều đó, tôi có thể đóng gói logic SELECT của tôi trong các khung nhìn khác nhau cho mỗi động cơ. Nhưng đó là trong tương lai, ngay bây giờ tôi đang tìm kiếm một "mẹo" nhanh chóng để xử lý vấn đề cụ thể này. –

3

Tạo chức năng công khai tùy chỉnh trong mô-đun.

Public Function COALESCE(InputValue, ValueIfNull) 
    COALESCE = nz(InputValue, ValueIfNull) 
End Function 

Thêm xử lý lỗi, v.v ..., cải tiến.

Bây giờ, bạn sẽ có thể sử dụng chức năng COALESCE trong MS Access và SQL.

Các vấn đề liên quan