varchar
se l'uguaglianza sono spinosi in TSQL. Il LEN
la funzione dice:
Restituisce il numero di caratteri, anziché il numero di byte, dell'espressione stringa data, esclusi gli spazi finali .
Devi usare DATALENGTH
per ottenere un vero byte
conteggio dei dati in questione. Se disponi di dati unicode, tieni presente che il valore che ottieni in questa situazione non sarà uguale alla lunghezza del testo.
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
Quando si tratta di uguaglianza di espressioni, le due stringhe vengono confrontate per l'uguaglianza in questo modo:
- Ottieni una stringa più corta
- Pad con spazi vuoti finché la lunghezza non è uguale a quella di una stringa più lunga
- Confronta i due
È il passaggio intermedio che sta causando risultati imprevisti:dopo quel passaggio, stai effettivamente confrontando gli spazi bianchi con gli spazi bianchi, quindi sono considerati uguali.
LIKE
si comporta meglio di =
nella situazione "spazi vuoti" perché non esegue il riempimento vuoto sul motivo che stavi cercando di abbinare:
if '' = ' '
print 'eq'
else
print 'ne'
Darà eq
mentre:
if '' LIKE ' '
print 'eq'
else
print 'ne'
Darà ne
Fai attenzione con LIKE
tuttavia:non è simmetrico:tratta gli spazi bianchi finali come significativi nel modello (RHS) ma non nell'espressione di corrispondenza (LHS). Da qui è tratto quanto segue:
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