oracle 做一个汽车牌照的列表[关闭]

3yhwsihp  于 2023-08-03  发布在  Oracle
关注(0)|答案(3)|浏览(98)

已关闭。此问题需要details or clarity。它目前不接受回答。
**希望改进此问题?**通过editing this post添加详细信息并阐明问题。

2天前关闭。
截至2天前,社区正在审查是否重新讨论此问题。
Improve this question
我想提取一个经过某个点的车牌列表。我被要求列出不是国内的车牌。
我想到了这个:

SELECT * FROM Customers 
WHERE PlakaNo LIKE '[012345678]%' 
and PlakaNo LIKE '__[A-Z]%'

字符串
国内的板材订单是这样的:

99 X 9999
99 X 99999
99 XX 999
99 XX 9999
99 XXX 99
99 XXX 999


(PlakaNo是车牌号码)

vmdwslir

vmdwslir1#

您的要求是:

  • 前面2个数字
  • 然后是1,2或3个字母
  • 最后是2345个数字

您正在寻找的组合是:

##A##      ##AA##      ##AAA##
##A###     ##AA###     ##AAA###
##A####    ##AA####    ##AAA####
##A#####   ##AA#####   ##AAA#####

字符串
最短的车牌将是5个字符长,最长的将是10。除了正则表达式之外,您始终可以在查询中包含where length(PlakaNo) between 5 and 10或类似的内容。
你可以这样做:

Oracle 21c

select * from customers
where regexp_like(PlakaNo, '^[0-9]{2}[A-Za-z]{1,3}[0-9]{2,5}$');


如果您希望车牌中的空格匹配,请尝试:

select * from customers
where regexp_like(PlakaNo, '^[0-9]{2}[[:space:]][A-Za-z]{1,3}[[:space:]][0-9]{2,5}$');


示例:https://dbfiddle.uk/yolYwnmh

SQL Server 2022

select PlakaNo
from customers
where PlakaNo like '[0-9][0-9][A-Za-z][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][0-9][0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][A-Za-z][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][A-Za-z][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][A-Za-z][0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][A-Za-z][0-9][0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][A-Za-z][A-Za-z][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][A-Za-z][A-Za-z][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][A-Za-z][A-Za-z][0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9][A-Za-z][A-Za-z][A-Za-z][0-9][0-9][0-9][0-9][0-9]'
;


示例:https://dbfiddle.uk/OiESyle8

PostgreSQL 14

select PlakaNo
from customers
where PlakaNo ~ '^[0-9]{2}[A-Za-z]{1,3}[0-9]{2,5}$'
;


示例:https://dbfiddle.uk/rAvrGKnx

MySQL 8

select PlakaNo
from customers
where PlakaNo regexp '^[0-9]{2}[A-Za-z]{1,3}[0-9]{2,5}$'
;


示例:https://dbfiddle.uk/mQUvaIU7

示例

create table customers (PlakaNo varchar(20));
insert into customers values
('smal'), ('too long info'), ('1BAD2'),
('12A12'), ('12A123'), ('12A1234'),
('12BB12'), ('12BB123'), ('12BB1234'), ('12BB12345'),
('12CCC12'), ('12CCC123'), ('12CCC1234'), ('12CCC12345'),
('12DDDD12'), ('12DDDD123'), ('12DDDD1234'), ('12DDDD12345');

结果

12A12
12A123
12A1234
12BB12
12BB123
12BB1234
12BB12345
12CCC12
12CCC123
12CCC1234
12CCC12345

说明

[0-9]将匹配一个数字。[0-9][0-9]匹配2个数字。在允许更多灵活性的数据库中,您可以执行[0-9]{2}表示2位数。
^表示在数据的开头开始匹配。
$表示匹配到数据结束。
'^[0-9]{2}[A-Za-z]{1,3}[0-9]{2,5}$'意味着,从数据开始,我想要一个数字{2}次,然后是大写字母或小写字母1,2或3次,然后是数字2,3,4或5次。
希望这对你有帮助。

编辑

如果你想在车牌号之间留出这样的空间,

## A ##      ## AA ##      ## AAA ##
## A ###     ## AA ###     ## AAA ###
## A ####    ## AA ####    ## AAA ####
## A #####   ## AA #####   ## AAA #####


那么你可以使用这些类型的查询:

Oracle 21c

select * from customers
where regexp_like(PlakaNo, '^[0-9]{2}[[:space:]][A-Za-z]{1,3}[[:space:]][0-9]{2,5}$');


示例:https://dbfiddle.uk/yolYwnmh

SQL Server在正则表达式(regex)中使用空格

select PlakaNo
from customers
where PlakaNo like '[0-9][0-9] [A-Za-z] [0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z] [0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z] [0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z] [0-9][0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z][A-Za-z] [0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z][A-Za-z] [0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z][A-Za-z] [0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z][A-Za-z] [0-9][0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z][A-Za-z][A-Za-z] [0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z][A-Za-z][A-Za-z] [0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z][A-Za-z][A-Za-z] [0-9][0-9][0-9][0-9]'
  or PlakaNo like '[0-9][0-9] [A-Za-z][A-Za-z][A-Za-z] [0-9][0-9][0-9][0-9][0-9]'
;


示例:https://dbfiddle.uk/ndgfZBXB

PostgreSQL

select PlakaNo
from customers
where PlakaNo ~ '^[0-9]{2} [A-Za-z]{1,3} [0-9]{2,5}$'
;


示例:https://dbfiddle.uk/eplGmji3

MySQL

select PlakaNo
from customers
where PlakaNo regexp '^[0-9]{2} [A-Za-z]{1,3} [0-9]{2,5}$'
;


示例:https://dbfiddle.uk/sVb1ENui

06odsfpq

06odsfpq2#

如果你使用的是PostgreSQL,你可以使用~操作符来匹配正则表达式。
然后,关于你的正则表达式,你可以这样做:

SELECT * FROM Customers
WHERE PlakaNo ~ '^\d{2}[A-Z]{1,3}\d{2,5}$';

字符串
SQL演示
详细信息:

  • ^在行首声明位置
  • \d匹配一个数字(相当于[0-9])
  • {2}与前一个标记精确匹配2次
  • A-Z匹配A(索引65)和Z(索引90)之间的单个字符(区分大小写)
  • {1,3}与前一个标记匹配1到3次
  • \d匹配一个数字(相当于[0-9])
  • {2,5}与前一个标记匹配2到5次
  • $Assert一行末尾的位置
7gyucuyw

7gyucuyw3#

仅使用SQL通配符:

select * from Plates where
      PlakaNo like '[0-9][0-9][A-Z]%[0-9][0-9]'           -- skeleton format
  and PlakaNo not like '%[A-Z][A-Z][A-Z][A-Z]%'           -- 4 consecutive alpha
  and PlakaNo not like '%[0-9][0-9][0-9][0-9][0-9][0-9]%' -- 6 consecutive numeric
  and PlakaNo not like '%[0-9][A-Z]%[0-9][A-Z]%'          -- >2 transitions

字符串
同样,如果不是稍微优雅一点:

select * from Plates where
      PlakaNo like '[0-9][0-9][A-Z]%[0-9][0-9]'
  and Plakano not like '___%[A-Z][A-Z][A-Z]%__'
  and PlakaNo not like '___%[0-9][0-9][0-9][0-9]%__'
  and PlakaNo not like '___%[0-9][A-Z]%__'


这确实假设您已经将输入限制为严格的字母数字字符。
https://dbfiddle.uk/WXHRVi8z

相关问题