Come l’operazione non restituisce righe sulla colonna di tipo nvarchar filtro se la colonna dei dati numerici

Ho nvarchar(50) colonna in una tabella di SQL Server e di dati come questo:

123abc
234abc
456abc

Mia domanda:

select * 
from table 
where col like '%abc'

Risultato atteso : tutte le righe devono essere restituiti
Risultato: Non vengono restituite righe

Funziona bene se la colonna è varchar ma non restituisce righe se il tipo è nvarchar.

Tutte le idee?



5 Replies
  1. 8

    Probabilmente avete spazi alla fine dei vostri dati. Date un’occhiata a questo esempio.

    Declare @Temp Table(col nvarchar(50))
    
    Insert Into @Temp(col) Values(N'123abc')
    Insert Into @Temp(col) Values(N'456abc ')
    
    Select * From @Temp Where Col Like '%abc'

    Quando si esegue il codice di cui sopra, si otterrà solo il 123 riga perché la 456 riga dispone di uno spazio per la fine di esso.

    Quando si esegue il codice visualizzato qui sotto, riceverai i dati previsti.

    Declare @Temp Table(col nvarchar(50))
    
    Insert Into @Temp(col) Values(N'123abc')
    Insert Into @Temp(col) Values(N'456abc ')
    
    Select * From @Temp Where rtrim(Col) Like '%abc'

    Secondo la documentazione in merito, COME nei libri on line (sottolineatura mia):
    http://msdn.microsoft.com/en-us/library/ms179859.aspx

    Pattern Matching Utilizzando COME

    COME supporta ricerche ASCII e Unicode pattern matching. Quando tutti gli argomenti (match_expression, di modello e di escape_character, se presenti) sono caratteri ASCII tipi di dati ASCII pattern matching viene eseguita. Se uno degli argomenti è un tipo di dati Unicode, tutti gli argomenti sono convertiti in Unicode Unicode e pattern matching viene eseguita. Quando si utilizzano dati Unicode (nchar o nvarchar tipi di dati) con COME, spazi vuoti finali sono significativi; tuttavia, per i dati non Unicode, gli spazi vuoti finali non sono significativi. Unicode COME è compatibile con lo standard ISO. ASCII COME è compatibile con le versioni precedenti di SQL Server.

  2. 1

    Sei sicuro che non ci sono spazi alla fine del valore? Si può fare questo per rimuovere lo spazio bianco:

    select *
    from yourTable
    where rtrim(yourcolumn) like '%abc'

    Se non si desidera utilizzare il RTRIM e il LIKE insieme si può usare anche:

    Select * 
    From yourTable 
    Where charindex('abc', col) > 0

    Da Microsoft sull’utilizzo di COME:

    SQL Server segue lo standard ANSI/ISO specifica SQL-92 (Sezione 8.2,
    Regole generali #3) su come confrontare le stringhe
    con gli spazi. Lo standard ANSI richiede imbottitura per il personaggio
    stringhe utilizzate nei confronti in modo che le lunghezze partita prima
    al loro confronto. L’imbottitura influenza direttamente la semantica di CUI
    e la clausola HAVING predicati e Transact-SQL stringa
    i confronti. Per esempio, Transact-SQL considera le stringhe ‘abc’ e
    ‘abc’ essere equivalenti per la maggior parte delle operazioni di confronto.

    L’unica eccezione a questa regola è il predicato LIKE. Quando il diritto
    lato di un predicato LIKE espressione funzionalità di un valore con un trailing
    spazio, SQL Server non pad i due valori per la stessa lunghezza
    prima il confronto si verifica. Perché lo scopo del COME
    predicato, per definizione, è quello di facilitare il criterio di ricerca piuttosto
    rispetto a un semplice test di uguaglianza di stringa, questo non violi la sezione
    la specifica ANSI SQL-92 accennato in precedenza.

    Se si conosce la posizione di partenza di ‘abc’ stringa, è possibile utilizzare SOTTOSTRINGA:

    Select *
    From yourTable 
    Where substring(Col, 4, 3) = 'abc'

    Ma quindi è possibile utilizzare charindex e substring insieme e non è necessario preoccuparsi di spazio bianco:

    select *
    from yourTable
    where substring(col, charindex('abc', col), 3) = 'abc'
    • D’accordo, ma funziona bene se il tipo è di tipo varchar. Con rtrim. Tutte le idee?
    • È possibile utilizzare charindex, vedi aggiornato risposta quanto riguarda l’utilizzo COME vedere il link support.microsoft.com/kb/316626
    • +1 per l’inclusione di ulteriori informazioni di feed-back. Il charindex suggerimento non è l’equivalente del rtrim query perché charindex ritorna la riga se la stringa di ricerca è ovunque all’interno dei dati, non solo la fine di esso.
  3. 1

    La query dovrebbe funzionare bene, ma si può anche provare.

    SELECT * FROM TABLE WHERE (COL LIKE '%abc%')

    Nel caso In cui ci sono personaggi non si riesce a vedere dopo il ‘abc’ parte.

    • Benvenuti a StackOverflow: se si posta del codice, XML o campioni di dati, preghiamo evidenziare quelle linee l’editor di testo e fare clic su “esempi di codice” pulsante ( { } ) sulla barra degli strumenti dell’editor di ben formato e la sintassi evidenziarlo!
  4. 0

    per nvarchar tipo è possibile utilizzare select in questo modo :-

    select * from Table where ColumnName like N'%abc%'
  5. 0

    Solo per documentare alcuni dei ASCII vs Unicode stranezza:

    -- ascii like
    if 'Non rational ' like 'Non[ --]rational%'  print 'like' else  print 'not like'
    
    -- unicode like
    if N'Non rational ' like N'Non[ --]rational%' print 'like' else  print 'not like'
    
    -- unicode like, trailing space removed
    if N'Non rational' like N'Non[ --]rational%' print 'like' else  print 'not like'
    
    -- unicode like, different wildcard
     if N'Non rational ' like N'Non_rational%' print 'like' else  print 'not like'

    Produce il seguente:

    like
    not like
    not like
    like

Lascia un commento