拉出搜索条件条件的SQL结果

时间:2012-01-04 17:34:10

标签: sql sql-server-2008 tsql search

请注意以下2个查询。第一个是4个查询的联合。我正在尝试根据前缀为“@”的3个SQL变量为搜索条件编写#2。因此,我们不必进行联合,而是考虑所有3个参数进行搜索。如果任何参数/变量是''(或NULL),只需忽略该条件,但仍然执行搜索。但是所有字段必须在搜索结果中为单行/记录相互组合。

如何重新编写QUERY#2以便根据搜索条件(@companyName,@ primaryPhone和@postalCode)提取结果?我认为where子句中的每个部分都必须有一些OR条件(因此它不会跳过'/ / NULL搜索条件的行),但我很好奇这是如何通常完成的。 where子句的@primaryPhone部分有点棘手,因为它同时看电话和传真。

QUERY#1

SELECT tempTable.optionValue, tempTable.optionText FROM (   

    SELECT 
        address.addressid AS 'optionValue', 
        address.name AS 'optionText'
    FROM 
        dbo.address 
    WHERE 
        addressid=1

    UNION

    -- Company Name internal partial match
    SELECT 
        address.addressid AS 'optionValue', 
        ('[' + CAST(address.addressid AS NVARCHAR(10)) + '] ' + ISNULL(address.name,'') + ', ' + ISNULL(address1,'') + ', ' + ISNULL(city,'') + ' ' + ISNULL(statecode,'') + ', ' + ISNULL(countrycode,'') + ' ' + ISNULL(postalcode,'')) AS 'optionText'
    FROM 
        dbo.[address]
        LEFT OUTER JOIN dbo.contact_address ON dbo.address.addressid = dbo.contact_address.addressid
        LEFT OUTER JOIN dbo.clientcontact ON dbo.contact_address.contactid = dbo.clientcontact.contactid
        LEFT OUTER JOIN dbo.client ON dbo.clientcontact.clientid = dbo.client.clientid
        LEFT OUTER JOIN dbo.contact ON dbo.contact_address.contactid = dbo.contact.contactid
    WHERE 
        client.name IS NOT NULL 
        AND client.name != ''
        AND @companyName != ''
        AND @companyName IS NOT NULL
        AND client.name LIKE '%' + @companyName + '%' 
        AND clientcontact.contacttypeid = 3 --primary contacts only

    UNION

    -- Primary Phone/Fax internal partial match     
    SELECT 
        address.addressid AS 'optionValue', 
        ('[' + CAST(address.addressid AS NVARCHAR(10)) + '] ' + ISNULL(address.name,'') + ', ' + ISNULL(address1,'') + ', ' + ISNULL(city,'') + ' ' + ISNULL(statecode,'') + ', ' + ISNULL(countrycode,'') + ' ' + ISNULL(postalcode,'')) AS 'optionText'
    FROM 
        dbo.[contact]
        LEFT OUTER JOIN dbo.clientcontact ON dbo.contact.contactid = dbo.clientcontact.contactid
        LEFT OUTER JOIN dbo.contact_address ON dbo.contact.contactid = dbo.contact_address.contactid
        LEFT OUTER JOIN dbo.address ON dbo.contact_address.addressid = dbo.address.addressid
    WHERE 
        (
            contact.dayphone IS NOT NULL 
            AND contact.dayphone != ''
            AND @primaryPhone != ''
            AND @primaryPhone IS NOT NULL
            AND contact.dayphone LIKE '%' + @primaryPhone + '%'
        )
        OR 
        (
            contact.fax IS NOT NULL 
            AND contact.fax != ''
            AND @primaryPhone != ''
            AND @primaryPhone IS NOT NULL
            AND contact.fax LIKE '%' + @primaryPhone + '%' 
        )
        AND clientcontact.contacttypeid = 3 --primary contacts only

    UNION

    SELECT 
        address.addressid AS 'optionValue', 
        ('[' + CAST(address.addressid AS NVARCHAR(10)) + '] ' + ISNULL(address.name,'') + ', ' + ISNULL(address1,'') + ', ' + ISNULL(city,'') + ' ' + ISNULL(statecode,'') + ', ' + ISNULL(countrycode,'') + ' ' + ISNULL(postalcode,'')) AS 'optionText'
    FROM 
        dbo.[contact]
        LEFT OUTER JOIN dbo.clientcontact ON dbo.contact.contactid = dbo.clientcontact.contactid
        LEFT OUTER JOIN dbo.contact_address ON dbo.contact.contactid = dbo.contact_address.contactid
        LEFT OUTER JOIN dbo.address ON dbo.contact_address.addressid = dbo.address.addressid
    WHERE 
        @postalCode != ''
        AND @postalCode IS NOT NULL
        AND address.postalcode LIKE @postalCode + '%'
        AND clientcontact.contacttypeid = 3 --primary contacts only

) AS tempTable

QUERY#2(搜索)

SELECT tempTable.optionValue, tempTable.optionText FROM (   

    SELECT 
        address.addressid AS 'optionValue', 
        address.name AS 'optionText'
    FROM 
        dbo.address 
    WHERE 
        addressid=1

    UNION

    SELECT 
        address.addressid AS 'optionValue', 
        ('[' + CAST(address.addressid AS NVARCHAR(10)) + '] ' + ISNULL(address.name,'') + ', ' + ISNULL(address1,'') + ', ' + ISNULL(city,'') + ' ' + ISNULL(statecode,'') + ', ' + ISNULL(countrycode,'') + ' ' + ISNULL(postalcode,'')) AS 'optionText'
    FROM 
        dbo.[address]
        LEFT OUTER JOIN dbo.contact_address ON dbo.address.addressid = dbo.contact_address.addressid
        LEFT OUTER JOIN dbo.clientcontact ON dbo.contact_address.contactid = dbo.clientcontact.contactid
        LEFT OUTER JOIN dbo.client ON dbo.clientcontact.clientid = dbo.client.clientid
        LEFT OUTER JOIN dbo.contact ON dbo.contact_address.contactid = dbo.contact.contactid
    WHERE 
        (
            client.name IS NOT NULL 
            AND client.name != ''
            AND @companyName != ''
            AND @companyName IS NOT NULL
            AND client.name LIKE '%' + @companyName + '%' 
        )
        AND 
        (
            (
                contact.dayphone IS NOT NULL 
                AND contact.dayphone != ''
                AND @primaryPhone != ''
                AND @primaryPhone IS NOT NULL
                AND contact.dayphone LIKE '%' + @primaryPhone + '%'
            )
            OR 
            (
                contact.fax IS NOT NULL 
                AND contact.fax != ''
                AND @primaryPhone != ''
                AND @primaryPhone IS NOT NULL
                AND contact.fax LIKE '%' + @primaryPhone + '%' 
            )
        )
        AND
        (
            @postalCode != ''
            AND @postalCode IS NOT NULL
            AND address.postalcode LIKE @postalCode + '%'
        )                       
        AND clientcontact.contacttypeid = 3 --primary contacts only

) AS tempTable

2 个答案:

答案 0 :(得分:1)

编辑新规则

                     |  Field = '' or NULL  |  Field != '' or NULL
---------------------+----------------------+-----------------------
Param  = '' or NULL  |    Include Record    |    Include Record
---------------------+----------------------+-----------------------
Param != '' or NULL  |    Exclude Record    |   Include if Match


WHERE 
    (
           @companyName = ''
        OR @companyName IS NULL
        OR client.name LIKE '%' + @companyName + '%' 
    )
    AND 
    (
        (
               @primaryPhone = ''
            OR @primaryPhone IS NULL
            OR contact.dayphone LIKE '%' + @primaryPhone + '%'
        )
        OR 
        (
               @primaryPhone = ''
            OR @primaryPhone IS NULL
            OR contact.fax LIKE '%' + @primaryPhone + '%' 
        )
    )
    AND
    (
           @postalCode = ''
        OR @postalCode IS NULL
        OR address.postalcode LIKE @postalCode + '%'
    )                       
    AND clientcontact.contacttypeid = 3 --primary contacts only

答案 1 :(得分:0)

@postalCode != ''
            AND @postalCode IS NOT NULL
            AND address.postalcode LIKE @postalCode + '%'

可以写成

AND address.postalcode LIKE IsNull(@postalCode, '') + '%'

根本不需要测试你有一个变量,当'='%'

时,sql会在执行中忽略它

在我的经验中,大量的OR会真正减慢查询速度(但无论如何都要看看exe计划)。这对眼睛来说也更容易了。