你的问题不是很清楚。
您可能无法使用 $ 之类的运算符以及 trim()、upper() 等函数来解决此问题。但它可能是并且您可能无法清楚地解释它。例如,如果 BName 是“Chello”并且标签有“Hello”或“Hello World”,它是否与 BName 匹配?我以为不是。 “Hello”是匹配的,但“Chello”不是,对吧?很遗憾,您没有提供任何示例数据。
使用 VFP 的解决方案听起来很可怕,而且速度很慢。希望您的零件和标签数据中没有太多数据,可以使用xbase + alines或使用正则表达式来解决。
虽然这看起来很丑而且会很慢,但我认为数据的原始设计很丑。
Create Cursor labels (Name c(20))
Insert Into labels Values ("hello WORLD!")
Insert Into labels Values ("HellO")
Insert Into labels Values ("way")
Create Cursor parts (Id i Autoinc, aname c(20), bname c(20))
Insert Into parts (aname, bname) Values ("aname value1","hello")
Insert Into parts (aname, bname) Values ("aname value2","hello world")
Insert Into parts (aname, bname) Values ("aname value3","HeLlo world")
Insert Into parts (aname, bname) Values ("aname value4","Hello World")
Insert Into parts (aname, bname) Values ("aname value5","Hello There")
Insert Into parts (aname, bname) Values ("aname value6","My World")
Insert Into parts (aname, bname) Values ("aname value7","World Fair")
Insert Into parts (aname, bname) Values ("aname value8","Two way")
Insert Into parts (aname, bname) Values ("aname value9","Chello")
Insert Into parts (aname, bname) Values ("aname value10","worlds")
Local oRegEx
oRegEx = Createobject("VBScript.RegExp")
oRegEx.IgnoreCase = .T.
oRegEx.Global = .T.
Select p.ID, p.AName, p.BName, ;
Cast(Iif(IsNull(tmp.Id), 'AName is:' + AName, 'BName is:' + BName) as c(30)) dummy ;
from parts p ;
left join ;
(Select distinct p2.ID from parts p2 ;
inner join labels lb ;
on IsSpecialMatch(m.oRegEx, p2.bname, lb.Name)) tmp ;
on tmp.Id = p.Id
Procedure IsSpecialMatch(toRX, tcValue1, tcValue2)
Local IsMatch
toRX.Pattern = '\b'+Trim(m.tcValue1)+'\b'
IsMatch = toRX.Test( m.tcValue2 )
If !IsMatch
toRX.Pattern = '\b'+Trim(m.tcValue2)+'\b'
IsMatch = toRX.Test( m.tcValue1 )
Endif
Return m.IsMatch
Endproc