2011-12-09 154 views
1

使用SQL Server 2005模糊SQL搜索

給定一個表:

| Role | Low | High | 
| A  | AA00 | ZZ* | 
| B  | * |  | 
| C  | AA00 | AZ99 | 

我怎麼會去有關執行選擇行其中一個值降到低中的查詢 - HIGH範圍。

例如我想選擇角色A和B,如果我比較低,高到「BB」和角色B如果我比較範圍爲「22」

AB99應該返回A,B,C

+0

這是代表實際數據的?所以'*'被用作通配符?並且在'B'中'High'值爲'null' - 是否也被認爲是通配符? – Yuck

+0

是的,這與實際數據非常接近。 SAP角色安全性數據準確:) *爲通配符,但不爲空。高不需要,因爲低已經包含所有 –

回答

2

嘗試這樣的:

DECLARE @CompVal VarChar(100) = '22'; 

WITH T AS (
    SELECT Role, Low, High 
    FROM (
    SELECT 'A' Role, 'AA00' Low, 'ZZ*' High 
    UNION 
    SELECT 'B' Role, '*' Low, NULL High 
    UNION 
    SELECT 'C' Role, 'AA00' Low, 'AZ99' High 
) U 
) 
SELECT * 
FROM T 
WHERE @CompVal BETWEEN Low AND High 
    OR (@CompVal >= Low AND NULLIF(High, '*') IS NULL) 
    OR (NULLIF(Low, '*') IS NULL AND @CompVal <= High) 
; 

我假設你都和*NULL使用通配符一樣的值。這會爲您的每個示例生成適當的結果。

請注意,這也取決於您使用的排序規則。對於大多數(包括默認排序規則SQL_Latin1_General_CP1_CI_AS),它會很好。

編輯:仔細看,你可能需要更換WHERE條款與此:

WHERE @CompVal BETWEEN 
     REPLACE(ISNULL(Low, '*'), '*', '0000') 
    AND REPLACE(ISNULL(High, '*'), '*', 'ZZZZ') 
+0

這是完美的。 *是通配符,所以B沒有上限,因爲*包含全部 –