我想用比較運算子查詢 PostgreSQL 表。該表有兩個字符變化列。
桌子
CREATE TABLE IF NOT EXISTS test.test
(
scope character varying COLLATE pg_catalog."default",
project_code character varying COLLATE pg_catalog."default"
)
價值觀
INSERT INTO test.test(scope, project_code) VALUES (NULL, 'AA');
INSERT INTO test.test(scope, project_code) VALUES ('A', 'AA');
當我不想用 aproject_code = 'AA'和 a查詢值時scope = 'A',我會寫:
SELECT * FROM test.test WHERE project_code LIKE 'AA' AND scope LIKE 'A';
它回傳我一行,結果還可以。
但是,當我嘗試使用 aproject_code = 'AA'和scope除 以外的任何其他值查詢值時'A',我會寫:
SELECT * FROM test.test WHERE project_code LIKE 'AA' AND scope NOT LIKE 'A';
它沒有回傳任何結果。但我有一排匹配這個。如何解釋這個以及如何撰寫這個查詢?
我嘗試了其他比較運算子<>,!=結果相同。我正在使用 PostgreSQL 13.6。
uj5u.com熱心網友回復:
您需要使用 NULL 安全比較運算子。SQL 標準將is not distinct from運算子定義為 NULL 安全版本,<>Postgres 支持這一點:
SELECT *
FROM test.test
WHERE project_code = 'AA'
AND scope IS DISTINCT FROM 'A';
uj5u.com熱心網友回復:
NULL在大多數操作中都會回傳NULL。例如
SELECT NULL LIKE 'A', NULL NOT LIKE 'A'
回傳 ( NULL, NULL)。可能NULL專門處理此案有助于:
SELECT
*
FROM
test.test
WHERE
project_code LIKE 'AA'
AND (scope IS NULL OR scope NOT LIKE 'A')
@a_horse_with_no_name 提供的解決方案更優雅;在運算子中使用“通配符”時,此解決方案可能會很有趣LIKE。
uj5u.com熱心網友回復:
select null like 'a' is true; --return false
select null not like 'a' is true; --return false
select null like 'a'; --return null
select null not like 'a' ; --return null
https://www.postgresql.org/docs/current/functions-matching.html。
如果模式不包含百分號或下劃線,則模式僅代表字串本身;在這種情況下, LIKE 的作用類似于等于運算子。模式中的下劃線 (_) 代表(匹配)任何單個字符;百分號 (%) 匹配任何零個或多個字符的序列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/444782.html
標籤:PostgreSQL
