0

我有一个 Varchar2 字段,它通常包含两个字母字符(例如ZH, SZ, AI,...)。我们称之为FOO

某些数据集保存AA1-A9到同一字段中。我需要选择所有行,除了那些。我使用该函数substr数字A分开。到目前为止一切顺利,<或者>似乎无法与"number-string"一起正常工作。

如何在不将其转换为数字的情况下实现这一点?有更简单的解决方案吗?

我在互联网上没有找到任何东西,我自己尝试达到了极限。

到目前为止,这是我的WHERE 子句:

WHERE (substr(FOO, 0, 1) != 'A'
 or (substr(FOO, 0, 1) = 'A' AND substr(FOO, 1, 1) > '9'));

它无限制地返回所有行。

我找到的唯一解决方案:

WHERE (FOO NOT IN ('A', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9'));

但是,如果在未来的某个地方会有A1- ,这并不是最优的A50。我必须在WHERE 子句中添加 51 个字符串。而且,由于查询是在源代码中,代码的可读性也会变差。

该解决方案应该适用于 ORACLESQL Server。提前致谢

4

2 回答 2

2

(substr(FOO, 0, 1) = (substr(FOO, 1, 1)- Oracle 以 1(而不是 0)开头。

所以你应该使用substr(FOO, 2, 1)来获取第二个符号。

但是,它不适用于具有 SUBSTRING(不是 SUBSTR)的 SQL Server。

如果您准备在不同的数据库中使用不同的方法,您也可以尝试正则表达式:

甲骨文

where not regexp_like(foo, '^A[1-9]{1,3}$')

^ 字符串开头
$ 字符串结尾
[1-9] 从 1 到 9 的任何数字
{1,3} 重复前面的表达式 1,2 或 3 次

匹配/不匹配的 FOO 示例'^A[1-9]{1,3}$' a123-- 可能匹配/可能不匹配(取决于 NLS 设置是否区分大小写)
A123-- 匹配(第一个符号是 'A',其他是 3 位数字)
A123b-- 不匹配(最后一个符号应该是一个数字)
A1234--不匹配(结尾应该有 1,2 或 3 个数字)
A12--匹配
A1--匹配

SQL Server T-SQL 中的 SQL Server
REGEXP_LIKE 转换

于 2014-11-27T10:56:09.503 回答
0

如果您的要求是仅包含除“A”之外的所有字母值,请考虑使用 LIKE 表达式,以便它可以与任何符合 ANSI 的 DBMS 一起使用:

WHERE FOO <> 'A' AND FOO NOT LIKE '%[^A-Z]%' 
于 2014-11-27T16:49:34.740 回答