Hi Jazz,

Some more comments inline...

Jasvinder S. Bahra wrote:
You may be able to use a CASE expression to solve this problem:

SELECT name, power FROM card
WHERE
( case when power = '*' or power = '{' or power = '^' then null else integer( power ) end ) > 7;

Unfortunately, the non-numeric characters I mentioned are the only ones in the data set *at the moment*. In the future, other non-numeric characters may be introduced - which makes this technique inpractical.
Another solution would be to write a function which returns null for your special characters and returns an integer for values which really are numbers. As you add more non-numeric characters, you just have to adjust this function. Then your query would look like this:

select name, power from card
where myCastFunction( power ) > 7;

I think i'm going to have to bite the bullet and just store the data in two columns - one of type INTEGER, the other VARCHAR, and just make sure the INSERT logic only populates the INTEGER column if the value is made up of numeric characters.
If you pursue this approach, you are still going to have to maintain the triaging logic which separates numbers from non-numeric strings. You could put the triaging logic in a function which is invoked at INSERT time and then add a generated column to your table:

CREATE TABLE card (
      name     VARCHAR(64)    NOT NULL,
      power    VARCHAR(16)    NOT NULL,
      integerPower int generated always as ( myCastFunction( power ) )
  );

The advantage of this approach is that you can put a useful index on integerPower and that might speed up your queries.

Hope this helps,
-Rick

I know this is a bit of a no-no in terms of database design, but I can't see any way around it.

In any case, thanks for the suggestion Rick.

Jazz



Reply via email to