SQL 比较列值不排除过滤器中的相等值
SQL Comparison of column values not excluding equal values from filter
SELECT
DISTINCT
isnull(dbo.fnRemovePatternFromString(p.Last_Name, '%[,-.'']%'), '') as [Last]
,isnull(dbo.fnRemovePatternFromString(p.First_Name, '%[,-.'']%'), '') as [First]
,isnull(upper(fm.ANS_TEXT), '') as [Faculty]
,isnull(upper((select fs.ANS_TEXT from dbo.ADD_ANSW fs where fs.ID = p.id and ques_id = 3)),'') as [Billing]
FROM person p
inner JOIN person_facilities pf ON p.ID = pf.ID
LEFT JOIN usr_FacultyMember fm ON p.ID = fm.id
LEFT JOIN dbo.ADD_ANSW fs ON p.ID = fs.id and QUES_ID = 3 or QUES_ID = 71
WHERE
pf.Current_status in ('Active')
and (UPPER(fm.ANS_TEXT) <> UPPER(fs.ANS_TEXT)); **this compare not working
我希望结果能够排除在 Faculty 和 Billing 列中具有相同值的结果。但结果仍然是这样的:
Last First Faculty Billing
Skywalker Luke NON-MFG NON-MFG
我在网上找不到关于此的任何信息。有什么想法为什么不排除那些都是非 MFG 的吗?看原文的话,一个是NON-Mfg,一个是NON-MFG,但是用大写的应该比较排除。
**更新:
我在 <> not always being round trip, so it can't compare correctly... LOWER(x) != LOWER(UPPER(x)). It was suggested to use collate, so I'm trying to find a good example. I'm having trouble applying this example of collate.
上找到了一些信息
显然您的数据库区分大小写。
要忽略这些列的区分大小写,请在每个列之后添加 COLLATE SQL_Latin1_General_CP1_CI_AS:
SELECT
DISTINCT
isnull(dbo.fnRemovePatternFromString(p.Last_Name, '%[,-.'']%'), '') as [Last]
,isnull(dbo.fnRemovePatternFromString(p.First_Name, '%[,-.'']%'), '') as [First]
,isnull(upper(fm.ANS_TEXT), '') as [Faculty]
,isnull(upper((select fs.ANS_TEXT from dbo.ADD_ANSW fs where fs.ID = p.id and ques_id = 3)),'') as [Billing]
FROM person p
inner JOIN person_facilities pf ON p.ID = pf.ID
LEFT JOIN usr_FacultyMember fm ON p.ID = fm.id
LEFT JOIN dbo.ADD_ANSW fs ON p.ID = fs.id and QUES_ID = 3 or QUES_ID = 71
WHERE
pf.Current_status in ('Active')
and fm.ANS_TEXT COLLATE SQL_Latin1_General_CP1_CI_AS <> fs.ANS_TEXT COLLATE SQL_Latin1_General_CP1_CI_AS;
决定在 crystal 报告中使用视图处理比较,而不是直接在 sql 表达式中处理视图。
Collate 没有像其他答案中建议的那样工作,并且正如所讨论的那样,<> 没有工作,并且 != 在 upper(x) 比较中没有工作。
SELECT
DISTINCT
isnull(dbo.fnRemovePatternFromString(p.Last_Name, '%[,-.'']%'), '') as [Last]
,isnull(dbo.fnRemovePatternFromString(p.First_Name, '%[,-.'']%'), '') as [First]
,isnull(upper(fm.ANS_TEXT), '') as [Faculty]
,isnull(upper((select fs.ANS_TEXT from dbo.ADD_ANSW fs where fs.ID = p.id and ques_id = 3)),'') as [Billing]
FROM person p
inner JOIN person_facilities pf ON p.ID = pf.ID
LEFT JOIN usr_FacultyMember fm ON p.ID = fm.id
LEFT JOIN dbo.ADD_ANSW fs ON p.ID = fs.id and QUES_ID = 3 or QUES_ID = 71
WHERE
pf.Current_status in ('Active')
and (UPPER(fm.ANS_TEXT) <> UPPER(fs.ANS_TEXT)); **this compare not working
我希望结果能够排除在 Faculty 和 Billing 列中具有相同值的结果。但结果仍然是这样的:
Last First Faculty Billing
Skywalker Luke NON-MFG NON-MFG
我在网上找不到关于此的任何信息。有什么想法为什么不排除那些都是非 MFG 的吗?看原文的话,一个是NON-Mfg,一个是NON-MFG,但是用大写的应该比较排除。
**更新: 我在 <> not always being round trip, so it can't compare correctly... LOWER(x) != LOWER(UPPER(x)). It was suggested to use collate, so I'm trying to find a good example. I'm having trouble applying this example of collate.
上找到了一些信息显然您的数据库区分大小写。 要忽略这些列的区分大小写,请在每个列之后添加 COLLATE SQL_Latin1_General_CP1_CI_AS:
SELECT
DISTINCT
isnull(dbo.fnRemovePatternFromString(p.Last_Name, '%[,-.'']%'), '') as [Last]
,isnull(dbo.fnRemovePatternFromString(p.First_Name, '%[,-.'']%'), '') as [First]
,isnull(upper(fm.ANS_TEXT), '') as [Faculty]
,isnull(upper((select fs.ANS_TEXT from dbo.ADD_ANSW fs where fs.ID = p.id and ques_id = 3)),'') as [Billing]
FROM person p
inner JOIN person_facilities pf ON p.ID = pf.ID
LEFT JOIN usr_FacultyMember fm ON p.ID = fm.id
LEFT JOIN dbo.ADD_ANSW fs ON p.ID = fs.id and QUES_ID = 3 or QUES_ID = 71
WHERE
pf.Current_status in ('Active')
and fm.ANS_TEXT COLLATE SQL_Latin1_General_CP1_CI_AS <> fs.ANS_TEXT COLLATE SQL_Latin1_General_CP1_CI_AS;
决定在 crystal 报告中使用视图处理比较,而不是直接在 sql 表达式中处理视图。
Collate 没有像其他答案中建议的那样工作,并且正如所讨论的那样,<> 没有工作,并且 != 在 upper(x) 比较中没有工作。