嘗試這樣的:
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')
這是代表實際數據的?所以'*'被用作通配符?並且在'B'中'High'值爲'null' - 是否也被認爲是通配符? – Yuck
是的,這與實際數據非常接近。 SAP角色安全性數據準確:) *爲通配符,但不爲空。高不需要,因爲低已經包含所有 –