【问题标题】:How to handle multiple wildcards with SQL Server如何使用 SQL Server 处理多个通配符
【发布时间】:2009-07-17 15:30:11
【问题描述】:

我有以下形式的过滤器:

对象 A

+/- Start         End
----------------------------------------------
+     000000080000  000000090000
-     000000800500
+     054*

对象 B

+/- Start         End
----------------------------------------------
+     000000090000  000000100000
+     00??00900500
-     000000900500
+     055*

意思是:

000000080000 和 000000090000 之间的数字(000000800500 除外)以及以 054 开头的数字与对象 A 相关联。

000000090000 和 000000100000 之间的数字(000000900500 除外)、匹配 00??00900500 的数字(当然 000000900500 除外)以及以 055 开头的数字与对象 B 相关联。

表结构示例:

CREATE TABLE dbo.Filter
(
     IDFilter   int IDENTITY PRIMARY KEY
)

CREATE TABLE dbo.FilterRow
(
     IDFilterRow    int IDENTITY PRIMARY KEY
    ,IDFilter       int  FOREIGN KEY REFERENCES dbo.Filter(IDFilter) NOT NULL
    ,Operator       bit --0 = -, 1 = + NOT NULL
    ,StartNumber    varchar(50) NOT NULL
    ,EndNumber      varchar(50) 
)

CREATE TABLE dbo.[Object]
(
     IDObject   int IDENTITY PRIMARY KEY
    ,Name       varchar(10) NOT NULL
    ,IDFilter   int FOREIGN KEY REFERENCES dbo.Filter(IDFilter) NOT NULL
)

我需要一种方法来确保在 SQL(或 CLR)中没有数字可以与超过 1 个对象相关联,而且我真的不知道如何做这样的事情(除了蛮力)。

我确实有一个 CLR 函数 Utils.fIsInFilter('?8*', '181235467895') 支持通配符,如果有帮助会返回 1...

【问题讨论】:

    标签: sql-server clr wildcard


    【解决方案1】:

    你能在 SQL 2005 中使用 CLR 函数吗?

    在原始 SQL 中可以使用 LIKE JOINS(其中 ? 变为 [0-9] 并且 * 变为 %),可能后跟 CAST,但这就是 CLR 函数的用途...

    【讨论】:

    • 是的,我可以使用 CLR 函数或 LIKE,但我仍然不知道该怎么做。例如,我怎么知道范围 12345678912-1900000000 是否可能与通配符“1*98*9??”重叠? (例如数字 122982123959 重叠)
    • 现在你给出了更复杂的例子,我猜 LIKE/CAST 对 single 有用吗?无论如何只有 123% 或 %123 类型。我说“可能”是因为事情很少“不可能”,但我不想尝试......
    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多