SQL 判断含有字母和数字的字符串,你想从一个表里筛选出部分行数据,筛选条件是你感兴趣的那个列只包含字母和数字字符,考虑下面的视图 V(SQL Server 用户需要把字符串连接操作符||替换为 +)。
SQL 判断含有字母和数字的字符串 问题描述
你想从一个表里筛选出部分行数据,筛选条件是你感兴趣的那个列只包含字母和数字字符,考虑下面的视图 V(SQL Server 用户需要把字符串连接操作符||替换为 +)。
视图 V 代表了你要查询的表,它包含如下所示的数据。
然而,你只希望从视图 V 中提取出如下所示的记录。
总之,你想过滤掉那些除了字母和数字还包含其他字符的行。
SQL 判断含有字母和数字的字符串 解决方案
首先找出字符串中所有可能出现的非字母数字字符,这似乎是更为直观的解决思路。但恰恰与之相反,我们发现从反面着手更容易:首先找出所有的字母字符和数字字符。如此一来,先把所有的字母字符和数字字符转换成一个单一的字符,然后就能把它们当作一个字符。这么做的好处是,经过转换处理之后这些字母和数字可以被当作一个整体来操作。一旦生成了原有字符串的副本,并把其中的字母字符和数字字符替换成某个指定的字符,很容易就可以将字母字符和数字字符从其他字符中分离出来。
DB2
使用 TRANSLATE 函数将字母字符和数字字符都替换成单一字符,然后找出那些除了该字符还包含其他字符的行。对于 DB2 用户来说,需要在视图 V 中调用 CAST 函数。否则,会因为数据类型转换错误而导致视图创建失败。转换为 CHAR 类型时尤其要注意,因为 CHAR 的长度是固定的(长度不足的部分会被填充上)。
MySQL
在 MySQL 中,视图 V 的语法稍有不同。
使用正则表达式能方便地找出包含非字母数字字符的行。
Oracle 和 PostgreSQL
使用 TRANSLATE 函数把字母字符和数字字符替换成单一字符,然后找出那些除了该字符还包含其他字符的行。对于 Oracle 和 PostgreSQL 而言,视图 V 不需要调用 CAST 函数。转换为 CHAR 类型时尤其要注意,因为 CHAR 的长度是固定的(长度不足的部分会被填充上)。如果确实需要转换类型,那么就转成 VARCHAR 或 VARCHAR2 类型。
SQL Server
因为 SQL Server 不支持 TRANSLATE 函数,我们必须遍历每一行数据,并找出那些包含非字母数字字符的行。有很多种办法可以实现这一点,下面的解决方案的思路是评估每个字符的 ASCII 值。
SQL 判断含有字母和数字的字符串 扩展知识
上述解决方案的关键在于能同时查看多个字符。通过使用 TRANSLATE 函数,我们可以很容易处理全部数字或全部字符,而且不需要循环枚举并逐一查看每个字符。
DB2、Oracle 和 PostgreSQL
视图 V 的 14 行数据里只有 9 行是字母字符和数字字符。为了筛选出只包含字母字符和数字字符的行,直接使用 TRANSLATE 函数即可。在本例中,TRANSLATE 函数把字符 0 ~ 9 和 a ~ z 都转换成了 a。一旦完成了这一转换,下一步就要比较转换后的行数据和一个(与当前行的数据)具有相同长度并且只包括 a 的字符串。如果二者相同,那么我们就可以认定该字符串仅由字母和数字构成,而且不含其他字符。
使用 TRANSLATE 函数(这里以 Oracle 语法为例)。
我们把全部数字和字母字符都替换成了一个独特的字符(我这里选择了 a)。一旦这种替换完成,那些仅由字母和数字组成的字符串就变成了一个由单一字符(本例中是 a)构成的字符串。这一点可以通过单独执行 TRANSLATE 函数来进行验证。
虽然字母字符和数字字符被替换掉了,但字符串的长度并没有发生变化。由于长度是一样的,被筛选出来的行就是那些调用了 TRANSLATE 函数之后返回值里只包括 a 的行。通过比较原字符串的长度和只包含 a 的字符串长度,我们保留了相等的行,过滤掉了其他的行。
最后一步就是只保留那些 TRANSLATED 和 FIXED 相等的字符串。
MySQL
WHERE 子句里的表达式如下所示:
上述条件使得那些仅包含数字和字母的行会被筛选出来。方括号里的取值范围 0-9a-zA-Z 表示所有可能出现的数字和字母。符号 ^ 表示否定,因而该表达式可被解释为“非数字或非字母”。返回值等于 1 代表 TRUE,0 代表 FALSE,因此整个表达式的意思是:“执行非数字和字母字符匹配操作,并返回结果等于 FALSE 的行。”
SQL Server
首先遍历视图 V 的每一行数据,DATA 列的每一个字符都会被作为一行返回。C 列的值代表了构成 DATA 值的每一个字符。
内嵌视图 X 不仅会逐行返回 DATA 列的每一个字符,还会提供每个字符的 ASCII 值。这是 SQL Server 的专有功能,ASCII 取值范围 48 ~ 122 代表了字母字符和数字字符。理解了这一点,我们就可以对 DATA 进行分组,并过滤掉 ASCII 值不在 48 ~ 122 范围内的值。
如果觉得《oracle如何判断数字中有字母 SQL 判断含有字母和数字的字符串》对你有帮助,请点赞、收藏,并留下你的观点哦!