SQL 查询的时候截取字段在逗号前的部分

这就是坑啊 别相信。
不要那样做。

sql取逗号第三位数

说实话,这很麻烦,因为不同的数据库工作方式不同。
只需按照您提到的示例进行操作即可。

对于MySQL,你确实需要使用SUBSTRING_INDEX和TRIM。
看这个例子: SQL SUBSTRING_INDEX(SUBSTRING_INDEX('1 ,2 ,3 ,4 ', ',', 3 ), ',', -1 )
这里有两个步骤。
第一步是使用 SUBSTRING_INDEX('1 ,2 ,3 ,4 ', ',', 3 ),它将在第三个逗号之前分割字符串,结果将为 '1 ,2 ,3 '。
在第二步中,使用 SUBSTRING_INDEX('1 ,2 ,3 ', ',', -1 ),这将删除最后一个逗号后面的部分,即“3 ”。
就这样一直旋转着。

Oracle则不同,它支持正则表达式: SQL REGEXP_SUBSTR('1 ,2 ,3 ,4 ', '[^,]+', 1 , 3 )
这行代码中,[^,]+表示匹配非逗号连续字符,1 为起始位置,3 为匹配出现次数。
这样就直接得到了第三个数字“3 ”。

对于 SQL Server,您需要使用 CHARINDEX 和 SUBSTRING 的组合: SQL 子字符串('1 ,2 ,3 ,4 ', CHARINDEX(',', '1 ,2 ,3 ,4 ', CHARINDEX(',', '1 ,2 ,3 ,4 ') + 1 ) + 1 , CHARINDEX(',', '1 ,2 ,3 ,4 ', CHARINDEX(',', '1 ,2 ,3 ,4 ') + 1 )
CHARINDEX(',', '1 ,2 ,3 ,4 ')
1 )
这玩意儿光看着就腻了。
首先使用 CHARINDEX 两次查找逗号位置,然后使用 SUBSTRING 停止。
CHARINDEX 第一次查找第一个逗号,第二次根据第一个逗号查找下一个逗号,最后查找两个逗号之间的字符串。

所以你看,MySQL 得先除后除,Oracle 直接用正则表达式来做,而 SQL Server 则得一层层找逗号。
每个人都有自己的问题。

sql截取特定字符前的数据

上周,一位客户问我关于 SQL 字符串拦截的问题。
他不明白为什么我总是建议使用 CHARINDEX 和 LEFT 来做到这一点。
后来我给他举了个例子,说他在使用SQL Server时,想要获取order_details表中product_name字段中小数点前的产品编号。
可以使用这个:
sql 选择 LEFT(产品名称, CHARINDEX(',', 产品名称)
1 ) AS 产品代码 DA 订单详情 哪里 CHARINDEX(',', 产品名称) > 0;
这时他问,为什么不使用MySQL的SUBSTRING_INDEX呢?我说,你的数据运行在SQL Server上。
SUBSTRING_INDEX 来自 MySQL。
最好能轻松使用它,但如果你切换到 SQL Server,你就必须改变你的方法。
他的场景是SQL Server环境,所以我就不多解释了。

但是如果你切换到MySQL,你可以直接使用SUBSTRING_INDEX,代码会看起来更干净:
sql 选择 SUBSTRING_INDEX(产品名称, ',', 1 ) AS 产品代码 DA 订单详情 哪里 LOCATE(',', 产品名称) > 0;
我之前在2 02 3 年做过一个项目,我使用SQL Server的CHARINDEX将URL的前半部分剪辑到某个字段中。
结果有数据就直接报错,因为有的url前面没有逗号。
当时我就觉得,写这种SQL的时候,一定要加上WHERE CHARINDEX('comma', field name) > 0,不然真的要跪了。

因此,当您选择一项功能时,您需要查看数据库,而不是将其视为一刀切的解决方案。
SQLServer和MySQL的函数名称和用途有很大不同。
无论您使用什么数据库,请更频繁地使用该功能。
不要混合它们,因为这可能会导致难以检测的错误。

求祝 sql中 取一个字段里第一个逗号前的数值。

老实说,这个 SQL 脚本非常有趣。
它直接在SQL Server中创建一个循环来分割字符串“A,B,C,D,E,F,G,H,I”,最后输出所有字母。
当我帮助客户创建报告时,我遇到了类似的需求——需求文档很清楚,但我花了很长时间才弄清楚如何实现它。

看看这段代码,@avarchar(1 000) 定义了一个足够长的字符串变量,尽管实际的赋值只有 9 个字母加几个逗号。
@iintSet@i=0 这行代码有点复杂,但它实际上声明了一个整型变量@i,初始值为0。
Set@a=&3 9 ;A,B,C,D,E,F,G,H,I&3 9 ;将字符串赋给变量a,并且用逗号分隔的字母都彼此靠近。

While(@i<=Len(@a))的判断条件其实是可以优化的。
Len(@a)的字符串长度为9 ,但当循环到第9 个字符时,子字符串函数已超出范围。
我尝试直接将其更改为 While(@i Begin中的PrintSubstring(@a,CHARINDEX(&3 9 ;,&3 9 ;,@a)+@i-1 ,1 )是核心。
CHARINDEX 查找逗号位置,@i-1 是当前字母的起始索引。
Substring截取长度为1 的子串,每次循环时给@i加2 ,完美跳过逗号,直接取字母。

执行完这一段后,控制台会按顺序打印ABCDEF GH I,字母之间有额外的空格。
如果字母之间不能有空格,可以调整 CHARINDEX(@a)+@i-2 的位置,将逗号向左移动。
这种类型的字符串处理在旧系统中很常见。
如今许多数据库都使用 JSON,但当时您可以使用这种传统方法来实现这一点,并且只需手动编写逻辑即可。

我记得数据是Len(@a) 9 ,但我建议你使用SQL来测试它。
如果字母数量超过1 000个字符,则可能需要更改子字符串。
我个人在这方面还没有运行过最新版本的SQL Server,但是原理是一样的。