请注意下面的2个查询。第一个对4个查询进行联合。我试图根据以“@”为前缀的3个SQL变量来为搜索条件编写#2。因此,我们不必进行联合,而是将所有3个参数考虑在内以进行搜索。如果任何参数/变量是''(或NULL),只要忽略该条件,但仍然执行搜索。但是所有字段必须在搜索结果中为单个行/记录相互结合。将搜索条件条件的SQL结果拉出
如何重写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(SEARCH)
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
如果一个字段为NULL,由于LEFT JOIN,应该忽略该条件吗? (或重写,如果该字段为NULL,则永远不会排除) – MatBailie 2012-01-04 17:42:22
是的,如果为''/ NULL,则忽略该条件,但如果是'/ NULL则不排除该行 – MacGyver 2012-01-04 17:44:50
我的意思是写“yes,ignore如果搜索条件为''(或NULL),但不排除该行,如果搜索条件''(或NULL)“... ...你询问数据库记录中的字段而不是搜索条件。在这种情况下,如果记录/行字段是''(或NULL),我想排除这些记录...所以我不希望修改后的答案@Dems中包含所有这些OR条件。 – MacGyver 2012-01-04 17:54:12