Pgsql错误:您可能需要添加显式类型转换

28

我的网站在部署到Heroku之前都能正常工作,但问题是Heroku使用的是PgSQL数据库而我使用的是MySQL和Laravel框架。

我的查询语句是:

$patient = Patient::where('patient_address', 'ILIKE' ,'%' . $request->input)->where('patient_sex', 'ILIKE' ,'%' . $request->gender)->whereHas('users', function($q) use($vaccine_id){
        $q->where('vaccine_id','ILIKE','%' . $vaccine_id);
    })->get();

在我将其部署到Heroku时,出现以下情况:

SQLSTATE[42883]: 未定义函数:7 ERROR:运算符不存在:整数~~*未知 LINE 1: ...ient_id" = "patients"."PatientID" and "vaccine_id" ILIKE $3)

HINT:没有匹配给定名称和参数类型的运算符。您可能需要添加显式类型转换。(SQL:从“patients”中选择 * where“patient_address”ILIKE%旧金山和“patient_sex”ILIKE%并存在(从“疫苗”中选择*内部加入“免疫接种”on“vaccines”。“VaccineID”=“immunizations”。 “vaccine_id”where“immunizations”。 “patient_id”=“patients”。 “PatientID”and“vaccine_id”ILIKE%))

我尝试使用CAST(vaccine_id AS VARCHAR),我没有得到错误,但它没有返回任何结果。


我不太熟悉这个API,但是where "patient_address" ILIKE %San Francisco是错误的,据我所知,San Francisco应该用单引号括起来。 - Tim Biegeleisen
它是一个变量$request->input = san fancisco,我该如何在其上放置单引号? - Christian
我不确定,但只有我能告诉你,如果查询输出是逐字的话,那就是错误的。 - Tim Biegeleisen
3个回答

32

问题在这里:

$q->where('vaccine_id','ILIKE','%' . $vaccine_id)

看起来vaccine_id是整数,你不能使用ILIKE操作符用于整数。尝试使用'='。

如果您想要使用LIKE、ILIKE或其他文本操作符,您必须将数据转换为文本格式。在SQL中,它应该是这样的:

WHERE "vaccine_id"::text ILIKE val

反而

WHERE "vaccine_id" ILIKE val

1
你的错误是 operator does not exist: integer ~~* unknown - 这是因为 vaccine_id 是整数。而整数没有 ILIKE(~~) 操作符。 - Roman Tkachuk
1
因为MySQL不是纯SQL,至少对我来说是这样。可能它会按照某些规则默认转换数据类型。 - Roman Tkachuk
1
所有类型都存在赋值运算符“=”,PostgreSQL可以将第二个类型转换,但不能将第一个类型转换。例如,“age” = '2' - PostgreSQL看到“age”是int类型,并将'2'转换为int类型。但是第一个参数必须手动转换。 - Roman Tkachuk
1
为什么需要ilike?如果这个整数可以使用其他比较方式,那么为什么要用ilike呢?ilike是大小写不敏感的比较方式,你会用它来进行什么类型的检查呢? - Roman Tkachuk
1
$q->WhereRaw("vaccine_id::text ILIKE '?' ", [$vaccine_id]) - Roman Tkachuk
显示剩余7条评论

9
你可以这样做:
$q->where('cast(vaccine_id AS VARCHAR)','LIKE','%' . $vaccine_id)

或者

$q->where('cast(vaccine_id AS TEXT)','LIKE','%' . $vaccine_id)

在通过JPA调用过程时,我遇到了这个错误。尝试使用::运算符进行转换,但没有成功,而cast()则可以正常工作。谢谢。 - sarath

-1
一个显式转换是一个你必须明确调用的转换,可以使用CAST AS关键字或转换运算符(::)来实现。

这并没有回答问题。 - snakecharmerb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接