2014-11-11 131 views
0

我试图修复一个SQL查询以便稍后将其转换为Doctrine2 DQL,因为它是Symfony2项目的一部分。这就是我的DDL有:如何在PostgreSQL中使用LIKE语句在WHERE中使用值?

CREATE TABLE "nomencladores"."norma" (
    "id" int4 NOT NULL, 
    "comite_tecnico_id" int4, 
    "numero" VARCHAR (10) COLLATE "default" NOT NULL, 
    "anno" int4 NOT NULL, 
    "nombre" VARCHAR (255) COLLATE "default" NOT NULL, 
    "activo" bool, 
    CONSTRAINT "norma_pkey" PRIMARY KEY ("id"), 
    CONSTRAINT "fk_f00cbe8e84edad75" FOREIGN KEY ("comite_tecnico_id") REFERENCES "nomencladores"."comite_tecnico" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION 
) WITH (OIDS = FALSE); 

而且我想执行一个LIKE查询发现%45%,我已经尝试了所有该查询没有成功:

的一个在DQL由Doctrine2产生

SELECT 
    n0_.numero AS numero0, 
    n0_.anno AS anno1, 
    n0_. ID AS id2, 
    n0_.nombre AS nombre3, 
    n0_.activo AS activo4, 
    n0_.comite_tecnico_id AS comite_tecnico_id5 
FROM 
    nomencladores.norma n0_ 
WHERE 
    n0_.anno LIKE %45%; 

尝试投放的值

SELECT 
    n0_.numero AS numero0, 
    n0_.anno AS anno1, 
    n0_. ID AS id2, 
    n0_.nombre AS nombre3, 
    n0_.activo AS activo4, 
    n0_.comite_tecnico_id AS comite_tecnico_id5 
FROM 
    nomencladores.norma n0_ 
WHERE 
    CAST (n0_.anno AS CHAR) LIKE %45%; 

SELECT 
    n0_.numero AS numero0, 
    n0_.anno AS anno1, 
    n0_. ID AS id2, 
    n0_.nombre AS nombre3, 
    n0_.activo AS activo4, 
    n0_.comite_tecnico_id AS comite_tecnico_id5 
FROM 
    nomencladores.norma n0_ 
WHERE 
    CAST (n0_.anno, "FM9999") LIKE %45% 

SELECT 
    n0_.numero AS numero0, 
    n0_.anno AS anno1, 
    n0_. ID AS id2, 
    n0_.nombre AS nombre3, 
    n0_.activo AS activo4, 
    n0_.comite_tecnico_id AS comite_tecnico_id5 
FROM 
    nomencladores.norma n0_ 
WHERE 
    to_char(n0_.anno, "FM9999") LIKE %45% 

SELECT 
    n0_.numero AS numero0, 
    n0_.anno AS anno1, 
    n0_. ID AS id2, 
    n0_.nombre AS nombre3, 
    n0_.activo AS activo4, 
    n0_.comite_tecnico_id AS comite_tecnico_id5 
FROM 
    nomencladores.norma n0_ 
WHERE 
    n0_.anno::text LIKE "%45%" 

,没有工作,什么是实现这一目标上的PostgreSQL的正确方法?

回答

4

的语法是:

WHERE n0_.anno::text LIKE '%45%'; 

您需要cast数量text(或varchar),然后才能与LIKE运营商使用它。
LIKE的右侧参数是一个text值。你的输入是一个字符串文字准确。你需要single quotes for values,双引号是标识符。

如果anno应该每年举行,你在最后两位数字只是感兴趣,请即:

WHERE n0_.anno::text LIKE '%45'; 

或者更好,但:

WHERE n0_.anno % 100 = 45; 

%modulo operator.(与LIKE模式中的%符号无关!)
45(不含引号)是numeric constant