2009-04-27 13 views

Répondre

280

LEFT(colName, 1) le fera aussi, aussi. C'est équivalent à SUBSTRING(colName, 1, 1).

J'aime LEFT, depuis que je trouve ça un peu plus propre, mais vraiment, il n'y a aucune différence de toute façon.

+0

Je ne sais pas SQL Server, mais logiquement un serveur de base de données peut être en mesure d'optimiser GAUCHE mieux que SUBSTRING quand il utilise un index. – thomasrutter

+7

@thomasrutter, En regardant un plan d'exécution, SQL Server (au moins 2008R2) traduit intérieurement 'LEFT (colName, longueur)' en SUBSTRING (colName, 1, length) '. Donc ** il n'y a pas d'optimisations ** ici, c'est juste une préférence. –

11

SUBSTRING (MyColumn, 1 , 1) pour le premier caractère et SUBSTRING (MyColumn, 1 , 2) pour les deux premiers.

28

Je préfère:

SUBSTRING (my_column, 1, 1) 

car il est syntaxe standard SQL-92 et donc plus facile à transporter.


à proprement parler, la version standard serait

SUBSTRING (my_column FROM 1 FOR 1) 

Le point est, la transformation d'un à l'autre, donc à toute variation de fournisseur similaire, est trivial.

p.s. Ce n'est que récemment que l'on m'a fait remarquer que les fonctions en SQL standard sont délibérément contraires, en ayant des listes de paramètres qui ne sont pas les habituels conventionnels, afin de les rendre facilement identifiables comme étant de la norme!

+0

Merci, LEFT (str, n) n'est pas supporté par de nombreux formats (y compris celui que j'utilise). – GreySage

0

Si vous recherchez le premier caractère de chaîne dans la chaîne Sql

SELECT CHARINDEX('char', 'my char') 

=> return 4 
1

ENTRÉE

STRMIDDLENAME 
-------------- 
Aravind Chaterjee 
Shivakumar 
Robin Van Parsee 

SELECT STRMIDDLENAME, 
CASE WHEN INSTR(STRMIDDLENAME,' ',1,2) != 0 THEN SUBSTR(STRMIDDLENAME,1,1) || SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,1)+1,1)|| 
SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,2)+1,1) 
WHEN INSTR(STRMIDDLENAME,' ',1,1) != 0 THEN SUBSTR(STRMIDDLENAME,1,1) || SUBSTR(STRMIDDLENAME,INSTR(STRMIDDLENAME,' ',1,1)+1,1) 
ELSE SUBSTR(STRMIDDLENAME,1,1) 
END AS FIRSTLETTERS 
FROM Dual; 

OUTPUT 
STRMIDDLENAME     FIRSTLETTERS 
---------      ----------------- 
Aravind Chaterjee    AC   
Shivakumar      S 
Robin Van Parsee     RVP 
4
SELECT SUBSTR(thatColumn, 1, 1) As NewColumn from student 
5

Il est simple à réaliser cela en suivant:

DECLARE @SomeString NVARCHAR(20) = 'This is some string' 
DECLARE @Result NVARCHAR(20) 

et soit

SET @Result = SUBSTRING(@SomeString, 2, 3) 
SELECT @Result 

@Result: his

-OU-

SET @Result = LEFT(@SomeString, 6) 
SELECT @Result 

@Result: This i

Questions connexes