【发布时间】:2019-10-13 07:41:04
【问题描述】:
这是我的查询的一部分:
select * from tb_test where IF(_Tags,
TAD.id IN (
SELECT T2.taggable_id as id FROM Tb_Taggables T2
WHERE T2.taggable_type = 'archives'
AND
FIND_IN_SET(T2.tag_id,_Tags)
)
,TRUE)
_Tags 的值如下:'377,379'。
我的Tb_Taggables 表:
CREATE TABLE Tb_Taggables (
id bigint UNSIGNED AUTO_INCREMENT
PRIMARY KEY,
tag_id bigint UNSIGNED NOT NULL,
taggable_id bigint UNSIGNED NOT NULL,
taggable_type varchar(191) NOT NULL,
created_at timestamp NULL,
updated_at timestamp NULL
)
COLLATE = utf8mb4_unicode_ci;
但我收到此错误消息:
[22007][1292] (conn=29800) Truncated incorrect DOUBLE value: '377,379'
【问题讨论】:
-
您在该查询中对
_Tags的任何使用都不应该产生该错误。 dbfiddle.uk/… -
样本数据在这里会很有帮助。请注意,
FIND_IN_SET出现在 MySQL 代码中通常是一种设计或代码气味。 -
_Tags是一个字符串,对吧?为什么它是函数if()的第一个参数? -
@S.M_Emamian 为什么不简单地写
IF (_Tags IS NOT NULL , ....)原因您收到此截断的警告/错误,因为IF(..)语句期望第一个参数是导致布尔值的条件表达式。因为,_Tags是文本,它会尝试将其隐式类型转换为布尔值,从而生成此警告 -
IF() 的第一个参数应该是一个布尔表达式:dev.mysql.com/doc/refman/8.0/en/…。您使用
_Tags的方式使 if() 返回始终为 TRUE(除非_Tags以数字开头)。
标签: mysql sql stored-procedures