【问题标题】:Case-Insensitive match with SQL/shell script与 SQL/shell 脚本不区分大小写匹配
【发布时间】:2015-06-13 19:43:59
【问题描述】:
#!/bin/ksh

echo "enter user ID\n"

read user_ID

echo "Searching user id $user_ID"

variable1=`sqlplus -s /  <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF ESCAPE '\'
select hr_id from users where hr_id LIKE '%\$user_ID %';
EXIT;
EOF`

if [ -n "$variable1" ];
then
echo "deleting the id $variable1"

variable2=`sqlplus -s /  <<EOF
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF ESCAPE '\'
delete from users where hr_id= '$user_ID';

else
echo "Please enter correct user ID."
fi

我需要 sql 查询从 db 中搜索正确的用户 ID,即使它以任何格式给出

select hr_id from users where hr_id LIKE '%\$user_ID %';

我想删除用户 ID ab123c。如果用户提供aBc123C 任何大小写格式,它应该从db 中搜索并找到ab123c 本身,因为提供的ID 将是唯一的。

用户 ID 可以是 AB12C 、 ab12c 或 'ab12c ' 其中任何一个都不确定。只有已知的是 id 中提供的字母和数字将与提供的顺序相同,并且是唯一的。

【问题讨论】:

  • 将输入转换为小写,然后使用WHERE LOWER(hr_id) LIKE
  • 您使用的是什么关系型数据库?它可能有一种内置的方式来进行不区分大小写的匹配。

标签: sql shell unix scripting


【解决方案1】:

你可以试试:

SELECT hr_id FROM users WHERE hr_id LIKE '%\$user_ID %' COLLATE utf8_general_ci;

甚至:

SELECT hr_id FROM users WHERE LOWER(hr_id) LIKE LOWER('%\$user_ID %');

如果您使用的是 PostgreSQL:

SELECT hr_id FROM users WHERE hr_id ILIKE '%\$user_ID %';

【讨论】:

    【解决方案2】:

    尝试这样的事情,如果您确定名称是唯一的,只需将它们都转换为小写:

    select hr_id from users where LOWER(hr_id) LIKE LOWER('%\$user_ID%');
    

    【讨论】:

      【解决方案3】:

      告诉你的 shell user_ID 是小写的:

      typeset -l user_ID
      read user_ID
      echo ${user_ID}
      

      【讨论】:

      • 用户 ID 可以是 AB12C 、 ab12c 或 'ab12c ' 其中任何一个都不确定。只有已知的是 id 中提供的字母和数字将与提供的顺序相同,并且是唯一的。
      • 是的。 typeset -l userID; userID=abCD12EF; echo $userID 返回abcd12ef
      猜你喜欢
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多