SQL Server相当于MySQL中的substring_index函数

安奇

我正在尝试将查询从MySQL移植到SQL SERVER2012。

如何为MySQL的substring_index()编写等效项?

MySQL SUBSTRING_INDEX()在指定次数的定界符之前返回给定字符串的子字符串。

SUBSTRING_INDEX(str,delim,count)

SELECT SUBSTRING_INDEX('www.somewebsite.com','.',2);

输出: 'www.somewebsite'

Bogdan Sahlean

尝试基于T-SQL和XQuery((root/row)[position() <= sql:variable("@count")])的以下解决方案

T-SQL标量函数:

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

SELECT dbo.SUBSTRING_INDEX(N'www.somewebsite.com', N'.', 2) AS Result;

输出:

/*
Result
---------------
www.somewebsite
*/

要么

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

SELECT  *
FROM    (
    SELECT N'www.somewebsite.com' UNION ALL 
    SELECT N'www.yahoo.com' UNION ALL 
    SELECT N'www.outlook.com'
) a(Value)
CROSS APPLY dbo.SUBSTRING_INDEX(a.Value, N'.', 2) b;

输出:

/*
Value               Result
------------------- ---------------
www.somewebsite.com www.somewebsite
www.yahoo.com       www.yahoo
www.outlook.com     www.outlook
*/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server相当于MySQL中的substring_index函数

来自分类Dev

相当于 SQL Server 中的 NULL

来自分类Dev

SQL Server相当于Excel的TINV函数

来自分类Dev

SQL Server相当于Excel的TINV函数

来自分类Dev

相当于SQL Server CTE的NuoDB

来自分类Dev

相当于Trunc的SQL Server

来自分类Dev

相当于sql在()中的firebase

来自分类Dev

相当于Sql Server数据库项目的MySql

来自分类Dev

相当于SQL窗口函数和行范围的Pandas

来自分类Dev

MS SQL相当于查询中MySQL用户定义的变量

来自分类Dev

SQL Server相当于Oracle多值IN子查询

来自分类Dev

SQL Server相当于Oracle Wallet Manager

来自分类Dev

相当于SQL Server快照隔离的Oracle

来自分类Dev

SQL Server 相当于 Oracle to_timestamp_tz()

来自分类Dev

SQL Server 相当于 TO_CHAR 和格式转换

来自分类Dev

SQL SERVER 相当于一个 HashMap?

来自分类Dev

相当于给定mysql查询的ORACLE SQL

来自分类Dev

BigQuery - 相当于标准 SQL 中的 GROUP EACH

来自分类Dev

熊猫相当于SQL where

来自分类Dev

相当于SQL连接的Dataweave

来自分类Dev

猪相当于SQL GREATEST / LEAST?

来自分类Dev

相当于R查询的sql

来自分类Dev

相当于MyISAM的MS SQL?

来自分类Dev

相当于SQL连接的Dataweave

来自分类Dev

相当于SQL“ 1.%”的Bash

来自分类Dev

BigQuery 相当于 SQL 查询

来自分类Dev

SQL按重要性四舍五入(相当于excel的floor函数)

来自分类Dev

相当于IBM DB2 9.7的MS SQL Server 2008“带有(无锁)”

来自分类Dev

MS SQL Server - 加入两个表,其中 ID 相当于新 ID