2010-01-26 3 views
3

Je connais ce genre de requête:Signification de %%% dans la requête sql?

select * from tableA where foo like '%bar%' 

Mais aujourd'hui, je tombe trois signes de pourcentage adjacents dans un code existant, comme celui-ci:

select * from tableA where foo like '%%%' 

Cette requête semble fonctionner, aussi bien mssql et oracle, quand foo est de type string (varchar, etc.) mais il échoue quand foo est numérique.

Une idée de ce que cela signifie?

EDIT: désolé pour la faute de frappe dans la question d'origine, la requête utilise l'opérateur LIKE.

+6

Ne recherche-t-il pas simplement la chaîne '%%%'? Ou est-ce que je manque quelque chose? ce n'est pas "comme". – Kobi

+1

vouliez-vous dire "où foo aime '%%%'" plutôt que "où foo = '%%%'"? –

+0

Comme l'a dit Kobi. Et votre première requête recherche «% bar%» car vous utilisez un opérateur '=' et non un 'LIKE'. –

Répondre

5

Active dans mysql il correspond everthing:

mysql> create database foo; 
Query OK, 1 row affected (0.06 sec) 

mysql> use foo; 
Database changed 

mysql> create table foo (bar char(20)); 
Query OK, 0 rows affected (0.06 sec) 

mysql> desc foo; 
+-------+----------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+-------+----------+------+-----+---------+-------+ 
| bar | char(20) | YES |  | NULL |  | 
+-------+----------+------+-----+---------+-------+ 
1 row in set (0.00 sec) 

mysql> insert into foo values ('endwith%'); 
Query OK, 1 row affected (0.05 sec) 

mysql> insert into foo values ('%startwith'); 
Query OK, 1 row affected (0.00 sec) 

mysql> insert into foo values ('cont%ins'); 
Query OK, 1 row affected (0.00 sec) 

mysql> insert into foo values ('doesnotcontain'); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from foo where bar like '%%%'; 
+----------------+ 
| bar   | 
+----------------+ 
| endwith%  | 
| %startwith  | 
| cont%ins  | 
| doesnotcontain | 
+----------------+ 
4 rows in set (0.00 sec) 
-2

Pensez-vous qu'il fonctionne avec des types numériques, esp. quand vous passez dans une chaîne pour comparer le champ avec?

De plus, que contient le champ foo?

Généralement, une clause LIKE est utilisée pour effectuer une comparaison avec joker. Mais, d'après votre exemple, le db a ce champ qui stocke les critères de wild card. Et, %%% semble signifier - tout ce qui contient seulement %%% comme sa valeur (surtout quand vous le comparez avec un signe =).

EDIT2: Si je le devine, LIKE '%%%' peut signifier tout ce qui contient% caractère.

+1

%%% ne signifie rien avec un caractère% dedans. Pour rechercher une valeur contenant un pourcentage, vous devez l'échapper, par exemple. O f foo LIKE '% | %%' ESCAPE '|' – AdaTheDev

+0

@AdaTheDev: J'ai corrigé ma réponse. OP * n'avait * pas mentionné la clause LIKE au début. – shahkalpesh

+0

Ouais, c'est plus clair maintenant :) – AdaTheDev

4

Si vous essayez de trouver une valeur avec un pour cent en ce que vous devez utiliser ESCAPE:

par exemple

SELECT * 
FROM SomeTable 
WHERE foo LIKE '%|%%' ESCAPE '|' 

Si foo est numérique (dans le type de données), vous obtiendrez une erreur si vous essayez de comparer une valeur numérique dans la colonne avec une chaîne.

+0

S'il vous plaît lire ma réponse avec mes commentaires maintenant, pour être en mesure de comprendre pourquoi j'ai dit ce que j'ai dit. En outre, la clause 'ESCAPE' est-elle applicable à sqlserver ainsi qu'à Oracle? – shahkalpesh

+0

@shahkalpesh - Oui, il est pris en charge dans SQL Server – AdaTheDev

+1

Merci. Je ne connaissais pas la clause 'ESCAPE' sur le serveur sql. – shahkalpesh

1
select * from tableA where foo='%%%' 

est équivalent à

select * from tableA where foo='%' 

Il la même idée que

ls * 

ou

ls ** 

Ce qui signifie qu'il correspondre à quelque chose. Et dans l'exemple: pour MySQL « % » correspond à tout et ls « * » correspond à tout

Si vous ajoutez 2%, il est équivalent d'un.

mysql> create table foo (bar char(20)); 
Query OK, 0 rows affected (0.06 sec) 

mysql> desc foo; 
+-------+----------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+-------+----------+------+-----+---------+-------+ 
| bar | char(20) | YES |  | NULL |  | 
+-------+----------+------+-----+---------+-------+ 
1 row in set (0.00 sec) 

mysql> insert into foo values ('endwith%'); 
Query OK, 1 row affected (0.05 sec) 

mysql> insert into foo values ('%startwith'); 
Query OK, 1 row affected (0.00 sec) 

mysql> insert into foo values ('cont%ins'); 
Query OK, 1 row affected (0.00 sec) 

mysql> insert into foo values ('doesnotcontain'); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from foo where bar like '%%%'; 
+----------------+ 
| bar   | 
+----------------+ 
| endwith%  | 
| %startwith  | 
| cont%ins  | 
| doesnotcontain | 
+----------------+ 
4 rows in set (0.00 sec) 
+0

Cette réponse est utile, ** si ** on sait ce que 'ls *' et 'ls **' font ;-) Il vaudrait mieux mentionner ce qu'il fait explicitement aussi. –

0

En SQL '%' et '_' (signe de soulignement) sont des caractères génériques.
'%' remplace n'importe quel nombre de caractères - équivalent à '*' dans la recherche de fichiers Linux/Unix et Windows.
'_' remplace un caractère - équivalent à '?' dans la recherche de fichiers Linux/Unix et Windows.

Comme autre mentionné, un « % » est équivalent à un nombre quelconque de « % » consécutifs, donc dans votre requête, vous pouvez remplacer '%%%' avec '%'

-2

nous écrire les chaînes entre guillemets quand et utiliser un opérateur, comme aime à les comparer: select * from emp where ename like 'KING';

à titre de comparaison de valeur numérique, nous DOE valeur pas mis entre guillemets et nous e opérateurs logiques tels que =: select * from emp where deptno = 20;