Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

2 cách trả về hàng chỉ chứa ký tự chữ và số trong Oracle

Dưới đây là hai phương pháp để trả về các hàng chỉ chứa các ký tự chữ và số trong Cơ sở dữ liệu Oracle.

Ký tự chữ và số là ký tự chữ cái và ký tự số.

Dữ liệu Mẫu

Chúng tôi sẽ sử dụng dữ liệu sau cho các ví dụ của chúng tôi:

CREATE TABLE t1 (
    c1 varchar(255) NULL
    );

INSERT INTO t1 (c1) 
    WITH c AS (
        SELECT 'Music' FROM DUAL UNION ALL
        SELECT 'Live Music' FROM DUAL UNION ALL
        SELECT 'Café' FROM DUAL UNION ALL
        SELECT 'Café Del Mar' FROM DUAL UNION ALL
        SELECT '100 Cafés' FROM DUAL UNION ALL
        SELECT '[email protected]' FROM DUAL UNION ALL
        SELECT '1 + 1' FROM DUAL UNION ALL
        SELECT '()' FROM DUAL UNION ALL
        SELECT '[email protected]#&()–[{}]:;'',?/*' FROM DUAL UNION ALL
        SELECT '`~$^+=<>“' FROM DUAL UNION ALL
        SELECT '$1.50' FROM DUAL UNION ALL
        SELECT 'Player 456' FROM DUAL UNION ALL
        SELECT '007' FROM DUAL UNION ALL
        SELECT 'é' FROM DUAL UNION ALL
        SELECT 'É' FROM DUAL UNION ALL
        SELECT 'é 123' FROM DUAL UNION ALL
        SELECT 'ø' FROM DUAL UNION ALL
        SELECT 'ø 123' FROM DUAL)
SELECT * FROM c;

SELECT c1 FROM t1;

Kết quả:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
()
[email protected]#&()–[{}]:;',?/*
`~$^+=<>“
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Tùy chọn 1:So sánh với [:alnum:]

Chúng ta có thể sử dụng REGEXP_LIKE() của Oracle hàm để so sánh giá trị với một biểu thức chính quy.

Khả năng biểu thức chính quy của Oracle bao gồm hỗ trợ cho các lớp ký tự POSIX. Do đó, chúng ta có thể sử dụng [:alnum:] Lớp ký tự POSIX trong biểu thức chính quy của chúng tôi để tìm các hàng có chứa ký tự chữ và số.

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');

Kết quả:

Music
Café
007
é
É
ø

Điều đó chỉ trả về những hàng không chứa gì ngoài các ký tự chữ và số. Nếu một hàng chứa cả ký tự chữ và số và không phải chữ và số, thì hàng đó sẽ không được trả về.

Lưu ý rằng ký tự khoảng trắng được coi là không phải chữ và số, và vì vậy nếu chúng ta muốn bao gồm khoảng trắng, chúng ta có thể thực hiện điều này:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:] ]+$');

Kết quả:

Music
Live Music
Café
Café Del Mar
100 Cafés
Player 456
007
é
É
é 123
ø
ø 123

Để trả lại tất cả các hàng chứa các ký tự chữ và số (ngay cả khi hàng cũng chứa các ký tự không phải chữ và số), chúng ta có thể thực hiện điều này:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '[[:alnum:]]');

Kết quả:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Tùy chọn 2:Chỉ định một phạm vi ký tự

Một cách khác để làm điều đó là chỉ định một dải ký tự trong biểu thức chính quy của bạn.

Ví dụ:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-z0-9]+$');

Kết quả:

Music
007

Bạn sẽ nhận thấy rằng điều này trả lại ít hàng hơn so với ví dụ đầu tiên của chúng tôi. Điều này là do tôi không bao gồm é , É hoặc ø các ký tự trong phạm vi của tôi, và vì vậy bất kỳ hàng nào chứa các ký tự đó đều bị loại trừ khỏi đầu ra.

Do đó, bạn sẽ cần phải cẩn thận khi sử dụng phương pháp này, trong trường hợp bạn vô tình loại trừ các ký tự mà bạn nên bao gồm.

Đây là một lần nữa với một phạm vi bao gồm các ký tự đó:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9]+$');

Kết quả:

Music
Café
007
é
É
ø

Chúng ta có thể bao gồm các khoảng trắng như sau:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9 ]+$');

Kết quả:

Music
Live Music
Café
Café Del Mar
100 Cafés
Player 456
007
é
É
é 123
ø
ø 123

Và chúng tôi có thể sử dụng phần sau để bao gồm tất cả các hàng chứa các ký tự từ phạm vi của chúng tôi (ngay cả khi chúng cũng chứa các ký tự bên ngoài phạm vi này):

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');

Kết quả:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Hoặc nếu chúng tôi không muốn bao gồm các ký tự unicode đó, chúng tôi có thể đơn giản hóa nó thành thế này:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '[A-Za-z0-9]');

Kết quả:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é 123
ø 123

Điều này không loại trừ các ký tự unicode đó khỏi đầu ra nếu chúng tình cờ chia sẻ một hàng với các ký tự chữ và số.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle (11.2.0.1):Cách xác định hàng hiện được cập nhật bởi câu lệnh UPDATE

  2. Làm thế nào để khai báo các tham số đầu vào-đầu ra trong thủ tục / chức năng được lưu trữ của máy chủ SQL?

  3. Cách trừ 2 ngày trong tiên tri để có kết quả theo giờ và phút

  4. Cập nhật các cột có giá trị Null

  5. Sử dụng các biến liên kết với mệnh đề SELECT INTO động trong PL / SQL