Maison >base de données >tutoriel mysql >Comment répliquer la fonction SUBSTRING_INDEX() de MySQL dans SQL Server ?

Comment répliquer la fonction SUBSTRING_INDEX() de MySQL dans SQL Server ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-16 01:36:02910parcourir

How to Replicate MySQL's SUBSTRING_INDEX() Function in SQL Server?

Équivalent SQL Server de la fonction SUBSTRING_INDEX() de MySQL

La fonction MySQL SUBSTRING_INDEX() extrait une sous-chaîne d'une chaîne donnée en fonction du nombre d'occurrences d'un délimiteur spécifié. Pour reproduire cette fonctionnalité dans SQL Server, plusieurs approches peuvent être utilisées.

Une méthode consiste à exploiter T-SQL et XQuery pour créer une fonction scalaire :

CREATE FUNCTION dbo.SUBSTRING_INDEX
(
    @str NVARCHAR(4000),
    @delim NVARCHAR(1),
    @count INT
)
RETURNS NVARCHAR(4000)
WITH SCHEMABINDING
BEGIN
    DECLARE @XmlSourceString XML;
    SET @XmlSourceString = (SELECT N'<root><row>' + REPLACE( (SELECT @str AS '*' FOR XML PATH('')) , @delim, N'</row><row>' ) + N'</row></root>');

    RETURN STUFF
    (
        ((
            SELECT  @delim + x.XmlCol.value(N'(text())[1]', N'NVARCHAR(4000)') AS '*'
            FROM    @XmlSourceString.nodes(N'(root/row)[position() <= sql:variable("@count")]') x(XmlCol)
            FOR XML PATH(N''), TYPE
        ).value(N'.', N'NVARCHAR(4000)')), 
        1, 1, N''
    );
END
GO

Une autre approche utilise une table en ligne. -fonction valorisée dans TSQL :

CREATE FUNCTION dbo.SUBSTRING_INDEX
(
    @str NVARCHAR(4000),
    @delim NVARCHAR(1),
    @count INT
)
RETURNS TABLE
AS 
RETURN
    WITH Base
    AS 
    (
        SELECT XmlSourceString = CONVERT(XML, (SELECT N'<root><row>' + REPLACE( (SELECT @str AS '*' FOR XML PATH('')) , @delim, N'</row><row>' ) + N'</row></root>'))
    )   
    SELECT STUFF
    (
        ((
            SELECT  @delim + x.XmlCol.value(N'(text())[1]', N'NVARCHAR(4000)') AS '*'
            FROM    Base b 
            CROSS APPLY b.XmlSourceString.nodes(N'(root/row)[position() <= sql:variable("@count")]') x(XmlCol)
            FOR XML PATH(N''), TYPE
        ).value(N'.', N'NVARCHAR(4000)')), 
        1, 1, N''
    ) AS Result;
GO

Ces deux solutions fournissent des alternatives efficaces à la fonction SUBSTRING_INDEX() de MySQL, permettant un portage transparent des requêtes entre les deux systèmes de base de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn