postgresql 对具有不同数据类型的多个列使用WHERE以满足bash和postgressql中的单个输入

mrphzbgm  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(146)

请协助以下操作。我正在尝试运行一个接受一个参数$1的脚本。该参数可以是字符串、字符或整数。我希望在where子句中使用该参数来搜索数据库中的元素。
这是要从中搜索的表:enter image description here
当我使用多个条件和OR时,它只在参数是数字或文本时才起作用。

ELEMENT=$($PSQL "SELECT * FROM elements e FULL JOIN properties p USING(atomic_number) WHERE symbol = '$1' OR name = '$1' OR atomic_number = $1;")

'
这是我用不同的参数enter image description here运行时得到的结果
请帮帮我。
先谢谢你

eaf3rand

eaf3rand1#

这在任何非数值参数上总是失败。
您正在传入H表示氢,但获取传入的任何内容并在atomic_number比较中将其用作无引号的数字,DB引擎正在尝试确定如何处理该数字。H不是数字,也不是带引号的字符串,因此它必须是列的名称...但它不是,因此您使用了无效语法。
我现在没有邮政编码,但是试试这个-

ELEMENT=$( $PSQL "
      SELECT * 
        FROM elements e 
   FULL JOIN properties p USING(atomic_number) 
       WHERE symbol = '$1' 
          OR name = '$1' 
          OR atomic_number = CAST(`$1` as INTEGER); " )

另外,顺便说一句......避免使用全大写的变量名。
按照惯例,这些变量应该是系统变量。
请不要嵌入图片除非是为了帮助澄清。
如果可以避免的话,不要依赖他们提供信息。复制/粘贴实际的格式化文本,人们可以在自己的测试中复制/粘贴。

xoefb8l8

xoefb8l82#

构造查询的另一种方法是:需要bash

looks_like_a_number() {
    # only contains digits
    [[ "$1" == +([[:digit:]]) ]]
}

sanitize() {
    # at a minimum, handle embedded single quotes
    printf '%s' "${1//\'/\'\'}"
}

if looks_like_a_number "$1"; then
    field="atomic_number"
    value=$1
elif [[ ${#1} -eq 1 ]]; then
    field="symbol"
    printf -v value "'%s'" "$(sanitize "$1")"
else
    field="name"
    printf -v value "'%s'" "$(sanitize "$1")"
fi

q="SELECT *
   FROM elements e
   FULL JOIN properties p USING(atomic_number)
   WHERE $field = $value;"

printf '%s\n' "$q"

result=$("$PSQL" "$q")

相关问题