10
votes

requête pour la formation de sous-chaîne

Je veux prendre le 01 partie d'une chaîne abcd_01 à l'aide de SQL. Quelle devrait être la requête pour cela, où la longueur avant le _ varie? C'est-à-dire qu'il peut être abcde_01 ou ab_01 . Fondamentalement, je veux une partie après le _ .


3 commentaires

Est-ce toujours les deux derniers caractères de la chaîne?


oui..it est deux derniers caractères


Voulez-vous interroger tous les tuples avec une valeur dont certains sous-chaînes sont _01?


4 Réponses :


1
votes

Pour obtenir 01 à partir d'abcd_01, vous devriez écrire de cette façon (en supposant que le nom de la colonne est COL1)

Sélectionnez la sous-chaîne (COL1, -2) du tableau

Cela vous donnera deux derniers caractères.


1 commentaires

Sur quels moteurs de DB cela fonctionnerait? Non SQL Server, Oracle utilise des substrations, etc., etc.



5
votes

Si ce sont toujours les 2 derniers caractères, utilisez droite (mystring, 2) dans la plupart des dialectes SQL


1 commentaires

Droite n'est supporté que par SQL Server et MySQL. Consultez ma réponse - Il n'y a pas de balle d'argent pour la mise en service constante Nom de la fonction et la syntaxe entre les bases de données.



16
votes

C'est l'un de ces exemples de la manière dont la fonctionnalité similaire entre SQL et les différentes extensions, mais sont suffisamment différentes que vous ne pouvez pas garantir la portabilité entre toutes toutes les bases de données.

Le Mot-clé de sous-chaîne, Utilisation de la syntaxe PostgreSQL (aucune mention de correspondance de modèle) est ANSI-99 . Pourquoi cela les a pris si longtemps, je ne sais pas. P>

Le creux de votre besoin est d'obtenir une sous-chaîne de la valeur de colonne existante, vous devez donc savoir quelle est la fonction de sous-chaîne de base de données Appelé. P>

Oracle H2>
SELECT SUBSTR('abcd_01', LENGTH('abcd_01') - 1, 2)


1 commentaires

Très bonne réponse. Petit détail: Je pense que les sépérateurs seraient mieux au-dessus des en-têtes. Maintenant, l'en-tête est à proximité de la réponse précédente IMO.



0
votes
select substring(names,charindex('_',names)+1,len(names)-charindex('_',names)) from test

1 commentaires

Pourriez-vous élaborer un peu sur votre réponse?