varchar
s a rovnost jsou v TSQL ožehavé. LEN
funkce říká:
Vrátí počet znaků, nikoli počet bajtů, daného řetězcového výrazu, bez koncových mezer .
Musíte použít DATALENGTH
získat skutečný byte
počet dotyčných údajů. Pokud máte data Unicode, mějte na paměti, že hodnota, kterou v této situaci získáte, nebude stejná jako délka textu.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Pokud jde o rovnost výrazů, jsou tyto dva řetězce porovnány z hlediska rovnosti takto:
- Zkrátit řetězec
- Vložka s mezerami dokud se délka nerovná délce delšího řetězce
- Porovnejte oba
Je to prostřední krok, který způsobuje neočekávané výsledky - po tomto kroku efektivně porovnáváte bílé znaky s bílými znaky - proto jsou považovány za stejné.
LIKE
chová se lépe než =
v situaci „prázdných míst“, protože neprovádí prázdná výplň na vzor, který jste se snažili porovnat:
if '' = ' '
print 'eq'
else
print 'ne'
Dá eq
zatímco:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Dá ne
Opatrně s LIKE
ačkoli:není symetrický:zachází s koncovými bílými znaky jako s významnými ve vzoru (RHS), ale nikoli se shodným výrazem (LHS). Následující je převzato odtud:
declare @Space nvarchar(10)
declare @Space2 nvarchar(10)
set @Space = ''
set @Space2 = ' '
if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'
if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'
@Space Not Like @Space2
@Space2 Like @Space