SQL查询对我没有意义

时间:2012-01-27 17:38:26

标签: sql sql-server sql-server-2008 tsql

我认为我的where子句是错误的。

我的困境是,如果用户在tbl_dentalBuyerInsurance中没有记录,那就意味着他们正在全力以赴。

因此,如果用户在tbl_dentalBuyerInsurance中没有记录,我希望他们回来作为结果。 如果他们在tbl_dentalBuyerInsurance中有记录并且匹配使用LIKE或相等,我也希望他们回来。

SELECT
[dbo].[tbl_users].*, [dbo].[tbl_dentalBuyerInsurance].*
     FROM
[dbo].[tbl_users]
    LEFT OUTER JOIN [dbo].[tbl_dentalBuyerInsurance] ON [dbo].[tbl_dentalBuyerInsurance].buyerId = [dbo].[tbl_users].id
    LEFT OUTER JOIN [dbo].[tbl_dentalInsurance] ON [dbo].[tbl_dentalInsurance].id = [dbo].[tbl_dentalBuyerInsurance].dentalInsuranceId
    WHERE
(
    (
        [dbo].[tbl_dentalInsurance].companyName LIKE '%Cigna%'
        OR [dbo].[tbl_dentalInsurance].companyName = ''
    )
    AND(
        [dbo].[tbl_dentalBuyerInsurance].ppo = 1
        OR [dbo].[tbl_dentalBuyerInsurance].ppo = ''
    )
    AND(
        [dbo].[tbl_dentalBuyerInsurance].hmo = 0
        OR [dbo].[tbl_dentalBuyerInsurance].hmo = ''
    )
)

2 个答案:

答案 0 :(得分:3)

鉴于您正在使用LEFT JOINS,如果在连接的“右侧”没有匹配的记录,则所有这些右侧字段将为NULL,而不是空字符串。你必须用.... OR whatever IS NULL明确地检查它,因为NULL不能等于任何东西,包括它自己。

答案 1 :(得分:1)

[dbo].[tbl_dentalInsurance].companyName LIKE '%Cigna%'
        OR [dbo].[tbl_dentalInsurance].companyName = ''

这意味着你是允许空字符串,这是你的第一个错误,以及如果你正在寻找空值所以如何查询MarcB所以查询是:

[dbo].[tbl_dentalInsurance].companyName LIKE '%Cigna%'
        OR [dbo].[tbl_dentalInsurance].companyName is null

如果你允许空字符串,那么你必须使用len函数来验证带有lenght 0的值

saludos