【问题标题】:Using SQL Server, is there a way to query (555) 344-2524 using 5553442524?使用SQL Server,有没有办法使用5553442524查询(555)344-2524?
【发布时间】:2013-06-17 12:41:33
【问题描述】:

使用 PHP SQLSRV 驱动程序连接到 SQL Server 2000,有没有一种方法可以使用以下数据匹配所有这些行:5553442524

555-344-2524
(555) 344-2524
555.344.2524
1-555-344-2524

我想这将通过可能使用存储过程的特定查询来完成?

谢谢。

【问题讨论】:

    标签: php sql sql-server-2000


    【解决方案1】:

    对于 SQL 2000,我能想到的唯一方法是使用 REPLACE 函数。

    declare @SearchTerm bigint
    
    Set @SearchTerm = 5553442524
    
    Select * From dbo.Table 
    Where Replace(Replace(Replace(Replace(Col1,'-',''), '(',''),')',''),'.','')
    = @SearchTerm
    

    这样做的问题是它不能满足领先的 1。

    更好的方法是包装所有这些逻辑in to a function

    例如

    Create Function dbo.fn_FormatTelephoneNumber(@input varchar(100))
    returns bigint
    as begin
    
    
    declare @temp bigint
    
    Set @temp = Replace(Replace(Replace(Replace(@input ,'-',''), '(',''),')',''),'.','')
    
    If Len(@temp) = 11
    begin
    Set @temp = Right(@temp, 10)
    end
    
    return @temp
    
    End
    

    要调用该函数,您可以像这样使用它:

    Select *,
          dbo.fn_FormatTelephoneNumber(YourColumnName) as [FormattedTelephoneNumber]
    From dbo.YourTable
    

    或者在WHERE 子句中使用它:

    Select *
    From dbo.YourTable
    Where dbo.fn_FormatTelephoneNumber(YourColumnName) = 5553442524
    

    显然,最好的办法是清理存储在列中的数据,并限制插入任何进一步的“坏”数据。虽然根据我的经验,说起来容易做起来难。

    【讨论】:

    • 我希望能够清理传入的数据,但正如您所说,说起来容易做起来难,因为数据来自一百多个网站,并且需要在每个实例中重新调整.
    • @TonyMancini 您可以在表中添加一个触发器,以便在将数据保存到数据库之前通过该函数传递数据。那将为您清理数据。但是,您必须确保您的函数考虑了所有可能性以防止失败。在生产中实施之前,我还会对性能进行一些测试。
    • 我在尝试运行查询时似乎遇到了错误; SELECT * FROM crm_main AS E, dbo.fn_FormatTelephoneNumber('5553442524') AS EID WHERE E.phone = EID.phone - 我得到无效的对象名称'dbo.fn_FormatTelephoneNumber'。
    • 将函数调用放入您的 WHERE 条件中,它不会返回要加入的表对象。
    • @TonyMancini 查看我对如何在查询中调用该函数的编辑。
    猜你喜欢
    • 2019-07-06
    • 2019-12-25
    • 2021-01-11
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多