0

我似乎无法解决这个问题。

我在名为 的 json 列中有几个翻译text,我只想选择那些没有特定语言(未设置或未设置null)的空翻译的记录。

如果值设置为,我很难创建一个不返回记录的查询null。以下是一些text列 json 值,我需要一个仅返回此示例中的第一条记录的查询,其中我有该fr值的翻译:

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"
text: "{"de": "und"}"

这是我到目前为止所尝试的:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") is not null' )->get();

-> 返回

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"

真可惜。它会跳过fr根本没有设置的记录(没关系),但会继续选择fr设置为的记录null。所以,我需要调整查询以排除记录"fr": null

让我们一步一步来。当我尝试对这样的字符串进行肯定匹配搜索时:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") = "merci"' )->get();

-> 返回

text: "{"de": "danke", "fr": "merci"}"

那是对的。现在,似乎很容易找到一种方法来切换它并使用"fr": null. 但没有运气。

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> "merci"' )->get();

->返回设置的记录fr,但不等于merci. 它跳过fr未设置的记录。

text: "{"de": "hallo", "fr": null}"

让我们尝试排除 fr 设置为 null 的记录。但也没有运气:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> "null"' )->get();

-> 返回

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"

或者,

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> null' )->get();

-> 返回一个空结果。

我怎么能排除fr未设置或设置为的值null

4

1 回答 1

1

我在类似的Stackoverflow 线程中找到了解决方案。对于具有初学者知识的人来说,这不是一个非常明显的问题。

似乎json 列中的值在我之前的查询尝试null中没有评估为相同的值。null需要进行如下调整,然后才能工作。基本上空值首先需要null使用以下代码更改为相同的值类型:

CAST("null" AS JSON)

然后将其放入查询中:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> CAST("null" AS JSON)' )->get();
于 2018-09-16T10:23:29.260 回答